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

标签 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;

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

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

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

1) One header table and 10 specific tables for to store each categories attributes

2) One header table and One attribute table that will hold all attributes of each and every classified groups. for those that are not relevant will hold NULL values

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

建分类网站的 friend 请指点一下。提前致谢

最佳答案

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

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

如果我对您的问题的理解正确,广告类别,例如“工作”、“待售”、“车辆”、“房地产”等。Categories 应该有 Attributes,其中属性可能是每个类别所特有的东西,例如车辆类别的“传输类型”或“里程”,或“平方英尺”或“年份”为房地产类别 build ”。

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

如果主类别在某种程度上是固定的,那么合理的设计选择是为每个类别的属性创建一个单独的表,这样每个广告列表将有一个来自 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 年代初还不错,但从那以后就真的落后了。它今天继续流行,主要是因为早期的势头以及廉价托管可用性方面的一些优势,而不是任何真正的技术优点。

关于c# - 我应该为每个类别使用单独的表还是一个表来存储分类网站的所有属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40467748/

相关文章:

c# - DateTime 是否适合仅存储日期?

sql - 修改 Wordpress SQL 查询以从类别中提取

jquery - 仅当 IE 8 或更早版本时才使用 ScriptReference 和 ScriptManagerProxy 加载脚本?

c# - WPF中分段进度条的一些快速简单的实现是什么?

c# - 判断三角形是否正对

mysql - 我应该重新计算表中的大量数据,还是应该将其保存在数据库中?

php - 在表单提交之前执行一些 sql 查询以将值插入数据库

c# - Razor 是倒退了一步吗?

asp.net - 如何在 MVC 应用程序中共享常见的 js/css?

c# - 在正则表达式 c# 中匹配 {{string}}