数据结构的数据结构,带有许多nulls



我当前正在尝试建模可以拥有或错过某些属性的动态数据对象(属性名称是当前要求已知的)。尚不清楚稍后是否会添加新属性(但几乎可以确定)。建模的对象是沿此行的东西:

int id PRIMARY KEY NOT NULL;
int owner FOREIGN KEY NOT NULL;
Date date NOT NULL;
Time time NOT NULL;
Map<String,String> properties;

属性可以是任何类型的属性(int,bool,string,...)

我不确定如何在SQL数据库中建模此对象。我可以想到两种方法来做到这一点,我想拥有一些输入,这将是开发人员"工作"(维护),内存消耗和性能的更好选择。作为附带信息:属性几乎总是null(不存在)

(1)我将有一个大表格,其中具有ID,所有者,日期,时间和每个属性为列,而一行缺少的属性被建模为NULL。例如

TABLE_X
id|owner|date|time|prop_1|prop_2|prop_3|...

此表将有很多零值。

如果要添加新属性,那么我会做一个Alter表,并为每个新属性插入一个新列

在这里我会做一个"通常"

SELECT * FROM TABLE_X ...

(2)我将拥有一个没有所有空数据的主表:

TABLE_X
id|owner|date|time

,然后为每个属性都有一个单独的表格,例如:

TABLE_X_PROP_N
foreign_key(TABLE_X(id))|value

这里根本没有零值。属性要么具有一个值,并且在其相应的表中,要么是null,然后在其表中不出现。

要添加新属性,我只会添加另一个表。

这里是

SELECT * FROM TABLE_X LEFT JOIN TABLE_X_PROP_1 ON ... LEFT JOIN TABLE_X_PROP_2 ON ...

重复该问题(因此您不必滚动):在维护(开发人员的工作),内存消耗(在磁盘上)和性能(每秒更多查询)方面,解决问题的方法更好?也许您也对如何处理有一个更好的想法。预先感谢

如果您使用选项2,我认为您需要3个表:

table_header
id |所有者|日期|时间

table_property
id |名称

table_propertyvalue
id | headerid(fk)| propertyId(fk)| value

易于添加新属性,可以使您更大的灵活性,并更快地迭代。属性的数量也将产生效果(例如,如果您有500个属性,则不需要一个带有500列的表!)。主要缺点是,如果您需要使用属性附加复杂的业务逻辑,将其作为更复杂的结构,并且无法执行数据完整性,那么它将变得丑陋。如果您真的想要像在对象结构中建模的财产袋,那么这很容易地映射。喜欢一切取决于您最合适的情况的一切。

解决方案2.但是为什么没有每个属性的单独表。只需将所有内容都放在一个桌子中:

properties(
foreign_key(TABLE_X(id))
property_name,
value);

听起来好像您正在尝试在这里实现一个实体 - attribute-value(经常查看的as-as-an-anti-)模式。你对他们熟悉吗?这是一些参考:

https://softwareengineering.stackexchange.com/questions/93124/eav-is-it-really-bad-in-bad-in-all-scenarios

http://www.dbforums.com/showthread.php?1619660-otlt-eav-design-why-do-do-peeople-hate-it

https://en.wikipedia.org/wiki/entity–Attribute–Value_model

就我个人而言,我对RDBMS中这种设置非常警惕。我倾向于认为NOSQL文档样式数据库将更适合这些类型的动态结构,尽管我本人对NoSQL的真实世界经验相对较少。

最新更新