我正在尝试为一个我已经开始的项目设计一个MySQL数据库,但我想不出最好的方法。
它是一个OOP系统,包含不同类型的对象,所有这些对象都需要存储在数据库中。但这些对象还需要保持父子关系。此外,我希望在系统投入生产后,能够灵活地添加新的数据类型。
据我所知,我有三个选择,一个是纯关系型的,一个我认为是实体属性值(我不太理解EAV),最后一个是我自己考虑过的混合设计,但我想我之前已经考虑过了,并且有一个合适的名称。
关系设计将由两个表组成,一个大表具有列,允许它存储任何类型的对象,另一个表用于维护第一个表中行的父子关系。
EAV设计将有两个表,一个是具有三列(实体id、属性和值)的EAV表,第二个表将关联这些实体的父子关系。
混合设计将为每种类型的对象创建一个表,然后创建一个父子关系表,该表必须存储父对象、子对象的id以及这些id所来自的表的某种标识符。
我确信这个问题已经被解决了数百次了,我会感谢任何参考资料,以便我能够阅读解决方案。
2条答案
按热度按时间uxhixvfz1#
这是唯一真正的关系设计:
但是MySQL不支持递归查询,因此如果您需要执行复杂的查询来获取整个树,例如,您需要使用另一种方法来存储关系。我建议采用闭幕表设计:
我在这里描述更多关于闭包表的信息:
xxls0lw82#
是的,你可以很好地使用EAV设计。它适用于我们创建的应用程序,尽管经过大约3年的改进。您还可以使用通用表结构,并对一组对象使用任何特定的表。或者只为每个对象创建一个通用表。哪个表的对象是元数据存储库的一部分。如果您使用val_int、val_string类型的结构,那么除了存储值的位置之外,您将拥有Null列。您可以考虑使用MS SQL的稀疏矩阵功能。如今,磁盘大小有些便宜。因此,与传统结构相比,唯一的缺点是NxR行(比如对象的R属性),而不是N行。
除此之外,很少需要注意的是对象示例GUID、动态sql生成。。。