Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何设计一个SQL数据库,其中表中的某些属性只与某些行相关?_Sql_Database_Database Design - Fatal编程技术网

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

如何设计一个SQL数据库,其中表中的某些属性只与某些行相关?,sql,database,database-design,Sql,Database,Database Design,我有一个名为Type_of_installations的表;它包含多个类型,每个类型都有公共字段,如成本、担保、制造商 但是,有些功能只与某些类型相关,例如 voltage, capacity, hours_per_week, lifting_power, weight, ... 这些可能只具有某些特征。我记得的一种方法是在每个不规则特征之后添加一个位字段,但我认为有更有效的技术来处理这个问题。我认为每次检查每一个不规则的特征位都会很烦人;这需要编程时间,而不是更多的处理时间 如果某些属性只与

我有一个名为Type_of_installations的表;它包含多个类型,每个类型都有公共字段,如成本、担保、制造商

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

voltage, capacity, hours_per_week, lifting_power, weight, ...
这些可能只具有某些特征。我记得的一种方法是在每个不规则特征之后添加一个位字段,但我认为有更有效的技术来处理这个问题。我认为每次检查每一个不规则的特征位都会很烦人;这需要编程时间,而不是更多的处理时间


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

位字段可以工作。另一种更为复杂的方式可能是采用EAV风格:

安装表字段:id、保修单、制造商 选项表字段:安装标识、选项名称、选项值

因此,如果您有一个包含必填字段的installations表,其中:

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字段上联接以查询它们。

如果您可以定义这些可选列的子集,这些可选列总是同时出现,则可以创建子表,每个子表都包含一个子集,并使用外键链接到主表

比如:

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

编辑:否则,在不使用字段时,只需将字段设置为NULL,在大多数情况下不需要位字段。您可以将空字段与上述内容结合起来,以获得一些合理有效且结构合理的组合。

对于此类数据,NoSQL可能是一种更好的方法

如果您对单个属性不感兴趣,例如从提升功率>400的对象中选择*,那么xml或序列化将是您的首选

除了经常使用但愚蠢的将所有可能的列放在表中之外,最好的选择是一个经典的财产袋

某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物某物 PropertyPropertyID、PropertyName、PropertyType等,在这里可以看到默认值、最小值和最大值

PropertiesOfThingysThingyID、PropertyID、PropertyValue PropertyValue将是一个字符串,您将使用PropertyType进行翻译


诸如此类的事情

那么,你的问题是什么?EAV不是一个好的方式。可能不是,但他要求其他选择,这一点出现在我的脑海中。你能详细解释一下为什么这不是一个好的方法,也许能给出一个更好的方法吗?我也很想看看。它比比特域好得多。一般来说,如果EAV是一种糟糕的方式,那么首先就不应该真正使用SQL数据库;在EAV设计中编写查询非常困难。因此,插入、更新和选择操作很难。有关反对EAV的原因列表,请参阅。