我不是MySQL的Maven,但我想在关系MySQL表上做一些类似对象层的事情。
我希望有很多“结构”,其中“bigint”、“longtext”、“datetime”和“double”类型的字段存储在7个表中。
实体类型(et_id,et_name)-“结构”列表;
entity_types_fields(etf_id,parent_et_id,…..,etf_ident,etf_type)-存储在一个表中的所有结构的结构属性列表;etf_type包含int值(0,1,2,3),它引用了下面描述的4个表中的一个。
实体(e_id,et_id)-所有可用实体的列表(实体的id和类型id)
和4个数据表(包含实体的所有数据)-
entities_props_bigint(parent_e_id,parent_etf_id,ep_data)-对于bigint数据属性entities_rops_longtext(parente_id、parent_eff_id、ep_data)-针对longtext数据属性**inties_props_datetime
从这样的数据层进行选择的最佳方式是什么?
让我有e_id(实体id)的列表,每个实体可以有任何类型。我想得到预定义的属性列表。如果某些实体没有这样的属性,我希望它等于NULL。
你知道怎么做吗?也许你有一些联系,或者已经处理过这样的事情。
谢谢
1条答案
按热度按时间j2qf4p5b1#
通过在关系数据库之上实现一个完整的元数据系统,您就是reinventing the wheel。许多开发人员使用have tried to do what you're doing,然后使用SQL来查询它,就像它是关系数据一样。但在SQL中实现非关系数据和元数据系统比您想象的要困难。
我已将问题的
relational
标记更改为eav
,因为您的设计是Entity-Attribute-Value设计的变体。堆栈溢出中有五个标记的限制。但是你应该意识到你的设计是不相关的。关系设计对于实体的所有示例都必须有一组固定的属性。在关系数据库中表示这一点的正确方法是使用表的列。这允许您为每个属性指定一个名称和一个数据类型,并确保相同的名称集及其数据类型适用于表的每一行。
从这样的数据层进行选择的最佳方式是什么?
查询设计的唯一可伸缩方式是获取属性数据和元数据作为行,并在应用程序代码中重构对象。
在上面的查询中,每个实体字段最多应匹配一个属性,其他数据列将为空。如果所有四个数据列都为空,则缺少实体字段。
回复你的评论,好吧,现在我更明白你想做什么了。树中有一组实体示例,但每个示例的类型可能不同。
以下是我将如何设计它:
实体(e_id、实体类型、名称、创建日期、创建者、sku等)
实体图书(e_id、isbn、页面、出版商、卷等)
实体视频(e_id、格式、地区、光盘等)
实体库存(e_id、面料、尺寸、颜色等)
实体路径(祖先__id、后代__id和路径长度)
有关类表继承和闭包表的更多信息,请参阅我的演示文稿Practical Object-Oriented Models in SQL和Models for Hierarchical Data in SQL,或我的书SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming或Martin Fowler的书i2j7k1l。