我正在开发一个分类广告网站。而且我完全陷入数据库设计层面。 广告只能分为1类。 在我的数据库中,我有一个名为“ads”的表格,其中包含所有广告通用的列。
CREATE TABLE Ads (
AdID int not null,
AdDate datetime not null,
AdCategory int not null,
AdHeading varchar(255) not null,
AdText varchar(255) not null,
etc...
);
我也有很多类别。 例如,在“汽车”类别中发布的广告具有其他列,如品牌,型号,颜色等。广告,张贴在“住房”中的列类似于住房类型,平方英尺。等等... 我做了类似的事情:
CREATE TABLE Cars (
AdID int not null,
CarMake varchar (255) not null,
CarModel varchar(255) not null,
...
);
CREATE TABLE Housing (
AdID int not null,
HousingType varchar (255) not null
...
);
AdId就是广告的外键。
但是,当我需要从广告中检索信息时,我必须查找所有这些附加表格,并检查广告中的AdId是否等于这些表格中的AdId。 对于每个类别,我都需要一个新表。我最终会得到15张左右的桌子。 我有一个想法,在广告表中有一个布尔列,如is_Cars,is_Housing等,但有15列,其中14将是NULL似乎是可怕的。 有没有更好的方法来设计这个数据库?我需要我的数据库处于第3范式,这是最重要的要求。
答案 0 :(得分:1)
据我了解,您的其他建议是一个单独的表格,其中每一行都有一个"类型"指示 - 汽车,房屋等(顺便说一句,不需要多列,例如' is_car',' is_house' - 单个列'类型&#更简单39 ;,例如type = 1表示car,type = 2表示house等)。然后是多列,其中一些列用于某些产品类型。 好吧,这里的优点是能够动态添加新类型(甚至是用户定义的类型)而无需更改数据库模式。也没有'加入'。在不利方面,你将存储&检索大量的' null'细胞,以及模式将不那么具有描述性:例如更难以设置约束" carModel列不可为空",因为它可以用于房屋(你可以使用触发器,但它的可读性较差)。
我个人更喜欢第一种解决方案(当然取决于用例,但第一种解决方案是我的第一直觉)。在考虑权衡之后,我可以放心地使用它,例如理解我能够容忍那些JOINS作为可读和附件的付款。紧凑的架构。
答案 1 :(得分:0)
一,您对类别和产品规格感到困惑。
二,你需要阅读表继承。
如果您不介意空值,请使用单表继承。所有"类别" (汽车,房屋......)进入一张桌子并且有一个"类型"列。
如果您不喜欢null,请使用Class Table Inheritance。使用指向类别外键的主键创建主表。为每个类型(汽车,房屋......)创建子表,其主键也是主表的外键。像Hibernate这样的ORM更容易实现。