我有一个名为Type_of_installations的表;它包含多种类型,每种类型都有公共字段,例如cost
,guarantee_end
,manufacturer
...
但是,有些功能仅与某些类型相关,例如
voltage, capacity, hours_per_week, lifting_power, weight, ...
这些可能仅存在一些功能。我记得的一种方法是在每个不规则的特征之后添加 位字段 ,但我认为有更有效的技术来处理这个问题。我认为每次检查每个不规则的特征位都很麻烦;这是编程耗时而不是更多的处理时间。
设计一组表的最佳方法是什么,其中某些属性仅与主表中的某些行相关?
答案 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进行翻译
有点事