更好的MySQL对象层方法

5sxhfpxr  于 2022-10-22  发布在  Mysql
关注(0)|答案(1)|浏览(201)

我不是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。
你知道怎么做吗?也许你有一些联系,或者已经处理过这样的事情。
谢谢

j2qf4p5b

j2qf4p5b1#

通过在关系数据库之上实现一个完整的元数据系统,您就是reinventing the wheel。许多开发人员使用have tried to do what you're doing,然后使用SQL来查询它,就像它是关系数据一样。但在SQL中实现非关系数据和元数据系统比您想象的要困难。
我已将问题的relational标记更改为eav,因为您的设计是Entity-Attribute-Value设计的变体。堆栈溢出中有五个标记的限制。但是你应该意识到你的设计是不相关的。
关系设计对于实体的所有示例都必须有一组固定的属性。在关系数据库中表示这一点的正确方法是使用表的列。这允许您为每个属性指定一个名称和一个数据类型,并确保相同的名称集及其数据类型适用于表的每一行。
从这样的数据层进行选择的最佳方式是什么?
查询设计的唯一可伸缩方式是获取属性数据和元数据作为行,并在应用程序代码中重构对象。

SELECT e.e_id, f.etf_ident, f.etf_type, 
    p0.ep_data AS data0, 
    p1.ep_data AS data1, 
    p2.ep_data AS data2,
    p3.ep_data AS data3
FROM entities AS e
INNER JOIN entity_type_fields AS f ON e.et_id = f.parent_et_id
LEFT OUTER JOIN entities_props_bigint   AS p0 ON (p0.parent_e_id,p0.parent_etf_id) = (e.e_id,f.etf_id) 
LEFT OUTER JOIN entities_props_longtext AS p1 ON (p1.parent_e_id,p1.parent_etf_id) = (e.e_id,f.etf_id) 
LEFT OUTER JOIN entities_props_datetime AS p2 ON (p2.parent_e_id,p2.parent_etf_id) = (e.e_id,f.etf_id) 
LEFT OUTER JOIN entities_props_double   AS p3 ON (p3.parent_e_id,p3.parent_etf_id) = (e.e_id,f.etf_id)

在上面的查询中,每个实体字段最多应匹配一个属性,其他数据列将为空。如果所有四个数据列都为空,则缺少实体字段。
回复你的评论,好吧,现在我更明白你想做什么了。树中有一组实体示例,但每个示例的类型可能不同。
以下是我将如何设计它:

  • 将所有实体子类型都具有的所有属性存储在一种超类型表中。

实体(e_id、实体类型、名称、创建日期、创建者、sku等)

  • 将特定于实体子类型的任何属性存储在它们自己的表中,如Martin Fowler的Class Table Inheritance设计中所示。

实体图书(e_id、isbn、页面、出版商、卷等)
实体视频(e_id、格式、地区、光盘等)
实体库存(e_id、面料、尺寸、颜色等)

  • 使用闭包表设计来建模对象的层次结构。

实体路径(祖先__id、后代__id和路径长度)
有关类表继承和闭包表的更多信息,请参阅我的演示文稿Practical Object-Oriented Models in SQLModels for Hierarchical Data in SQL,或我的书SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming或Martin Fowler的书i2j7k1l。

相关问题