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

C# 我应该为每个类别使用单独的表还是一个表来存储分类网站的所有属性?,c#,mysql,asp.net,sql-server,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, `dist

我正在使用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;
因此,如果是招聘广告,我有另一个表来存储仅与招聘广告相关的属性,如工资、就业类型、工作时间

此外,如果是车辆,我有单独的表格存储燃油类型、变速箱类型等

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

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

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

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


对于那些谁建立分类网站,请给我一个指南。提前谢谢

这个问题我不太清楚,但我可以给出一些建议:

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

如果我正确理解您的问题,
广告
类别
如“工作”、“待售”、“车辆”、“房地产”等。
类别
应该有
属性
,其中属性可能是每个类别特有的东西,如车辆类别的“变速箱类型”或“里程数”或“平方英尺”或房地产类别的“建造年份”

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

如果主类别是固定的,那么合理的设计选择是为每个类别的属性设置一个单独的表,这样每个广告列表将有一条来自
ad_标题
的记录,以及一条来自该类别的特定
属性
表的记录。因此,车辆列表将具有
ad_标题
记录和
vehicle_属性
记录

如果类别更具流动性,在这种情况下,合理的设计选择是有一个
categryattributes
表,定义每个类别使用的属性,以及一个
Ad\u Listing\u Attributes
表,该表保存每个列表的属性数据,这将包括
类别属性
广告头
的外键。请注意,此表的模式实际上遵循实体/属性/值模式,这被广泛认为实际上更像是一种反模式。也就是说,在大多数情况下,这是需要避免的。但是,如果您希望经常添加新类别,这可能是您在这里所能做的最好的

最后一个选项是将所有类别的属性放在一个大表中,并只填充您需要的内容。因此,车辆列表将只有
ad_标题
记录,但记录中会有许多
NULL
列。在这种情况下,我会避免这种情况,因为您的理想场景将需要某些类别的属性(即:不可为null的列),但保留其他选项

这是另一种情况,Postgresql可能是更好的DB选择。Postgresql有一种称为表继承的东西,它是专门为解决这种情况而设计的,允许您避免使用EAV表模式



充分披露:在大多数情况下,我实际上是一个Sql Server的家伙,但看起来Postgresql可能更适合你。我的经验是MySql在90年代末和00年代初很好,但从那时起就落后了。如今,它仍然很受欢迎,主要是因为早期的势头以及廉价主机可用性方面的一些优势,而不是任何真正的技术优势。

对MySql的选择表示哀悼。虽然我对想要一个开放且低成本的数据库表示同情,但MySql已经远远落后于Oracle、Sql Server和Postgresql十多年了,Postgresql也是开放且低成本的。@JoelCoehoorn恕我直言,您的回答与我的问题无关:)谢谢Joel..那么您的最终决定是什么?一个标题表包含多个属性表,还是一个标题表包含一个属性表?正如我所说的。。这取决于网站的性质。随着时间的推移,这些属性会发生多大的变化?从理论纯度的角度来看,前一个选项可能是首选,但如果你在发布后将每一个新属性都添加到一个类别中,那将带来痛苦。如果你经常看到这种情况,你可能想考虑EAV选项。