如何设计一个SQL数据库,其中表中的某些属性只与某些行相关?

时间:2013-01-03 17:59:33

标签: sql database database-design

我有一个名为Type_of_installations的表;它包含多种类型,每种类型都有公共字段,例如costguarantee_endmanufacturer ...

但是,有些功能仅与某些类型相关,例如

voltage, capacity, hours_per_week, lifting_power, weight, ...

这些可能仅存在一些功能。我记得的一种方法是在每个不规则的特征之后添加 位字段 ,但我认为有更有效的技术来处理这个问题。我认为每次检查每个不规则的特征位都很麻烦;这是编程耗时而不是更多的处理时间。

设计一组表的最佳方法是什么,其中某些属性仅与主表中的某些行相关?

3 个答案:

答案 0 :(得分:2)

位字段可行。另一种更复杂的方式可能是做EAV风格:

“安装”表字段:id,guarantee_end,manufacurer
“options”表字段:install_id,option_name,option_value

因此,如果您有一个“安装”表,其中包含您所需的字段:

 id guarentee_end manufacurer
 1  20140101      IBM
 2  20140701      Lenovo

您的“选项”表格可以包含:

 install_id option_name option_value
 1          cost        1000.00
 1          color       green
 2          foo         bar

您存储的每条记录不超过需要,而无需严格定义这些可能的选项。您只需根据需要添加它们,并加入install_id字段以查询它们。

答案 1 :(得分:1)

如果您可以定义始终一起显示的这些可选列的子集,则可以创建子表,每个子表包含一个子集,并使用外键链接到主表。

类似的东西:

MainTable(id int, guarantee_end int, manufacturer int)
Electric(id int, voltage float, watts float, mainTableID int foreign key)

编辑:否则,如果字段在未使用时为NULL,则不需要位字段(在大多数情况下)。您可以将NULL字段与上述字段组合在一起,以获得一些合理有效且结构合理的组合。

答案 2 :(得分:1)

对于这类数据,NoSQL可能是更好的途径。

如果您对个别财产不感兴趣,例如select * from Things Where lifting_power> 400,然后xml或序列化将成为一个观众。

除了经常使用但是愚蠢的把所有可能的列放在桌子上,你最好的选择是一个经典的属性包

Thingy(ThingyID,ThingyName等) 属性(PropertyID,PropertyName,PropertyType等),看到默认,最小和最大的各种事情

PropertiesOfThingys(ThingyID,PropertyID,PropertyValue)PropertyValue将是一个字符串,您将使用PropertyType进行翻译

有点事