我应该为每个类别或一个表使用单独的表来存储分类网站的所有属性吗?

时间:2016-11-07 14:35:38

标签: c# mysql asp.net sql-server

我正在使用asp.net开发一个机密网站,我的数据库是mysql。请MSSQL用户我也需要你的支持。这是与特定数据库提供程序无关的数据库模式的问题。

我只想向你澄清一下。

所以在这里,因为这是一个分类网站,你可以发布招聘广告,车辆广告,房地产广告等...

所以我有一个标题表来存储有关广告的常见详细信息。喜欢标题,描述等。

CREATE TABLE `ad_header` (
  `ad_header_id_pk` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `district_id_fk` tinyint(5) unsigned NOT NULL,
  `district_name` varchar(50) DEFAULT NULL,
  `city_id_fk` tinyint(5) unsigned DEFAULT NULL,
  `city_name` varchar(50) DEFAULT NULL,
  `category_id_fk` smallint(3) unsigned NOT NULL,
  `sub_category_id_fk` smallint(3) unsigned DEFAULT NULL,
  `title` varchar(100) NOT NULL,
  `description` text NOT NULL,
  ...............
  PRIMARY KEY (`ad_header_id_pk`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

因此,如果它是一个招聘广告,我有另一个表来存储与薪水,就业类型,工作时间等JOb广告相关的属性

此外,如果是车辆广告,我有单独的表来存储燃料类型,传输类型等......

所以我有10个类别。这些类别在十年内不会改变。所以现在我有这两种方法

  

1)一个标题表和10个用于存储每个表的特定表   类别属性

     

2)一个标题表和一个属性表   这将保留每个分类组的所有属性。对于那些不相关的将保留NULL值

在性能和可伸缩性方面,最好的方法是什么。

对于那些建立机密网站的人,请给我一个指南。提前致谢

1 个答案:

答案 0 :(得分:3)

这个问题对我来说并不完全清楚,但我可以给出一些建议:

首先,如果您发现自己想要在单个列/单元格中存储分隔值,则需要退后一步并创建一个新表来保存该信息。切勿将分隔数据存储在一个列中。

如果我理解你的问题,AdsCategories喜欢“工作”,“待售”,“车辆”,“房地产”等,Categories应该有Attributes,其中属性可能是每个类别唯一的事物,例如车辆类别的“传输类型”或“里程”,或房地产类别的“平方英尺”或“年度构建”。

处理这种情况的方法不止一种。

如果主要类别在某种程度上是固定的,那么为每个类别的属性设置一个单独的表是合法的设计选择,这样每个广告列表都会有一个来自ad_header的记录,以及一个来自该类别的特定Attribute表。因此,车辆列表将具有ad_header记录和vehicle_attributes记录。

如果类别更流畅,在这种情况下,拥有一个CateogryAttributes表也是合法的设计选择,该表定义了每个类别使用的属性,以及保存的Ad_Listing_Attributes表每个商家信息的属性数据,包括CategoryAttributesAd_header的外键。请注意,此表的模式有效地遵循实体/属性/值模式,这被广泛认为实际上更像是反模式。也就是说,在大多数情况下,这是需要避免的。但是,如果您希望经常添加新类别,那么它可能是您在这里可以做的最好的。

最后一个选项是将所有类别的属性放在一个大表中,并仅填充您需要的内容。因此,车辆列表只有ad_header条记录,但记录中会有很多NULL列。在这种情况下我会避免这种情况,因为您的理想情况会要求某些类别的某些属性(即:NOT NULLABLE列),但留下其他选项。

这是Postgresql可能是更好的数据库选择的另一种情况。 Postgresql有一种叫做表继承的东西,它专门用于解决这种情况,允许你避免使用EAV表模式。

完全披露:在大多数情况下,我实际上是一个Sql Server人员,但看起来Postgresql似乎更适合你。我的经验是MySql在90年代末和00年代早期表现不错,但自那以后确实落后了。它今天继续流行,主要是因为早期的势头以及廉价主机可用性的一些优势,而不是任何真正的技术优点。