gpt4 book ai didi

mysql - 做 MySQL 对象层的更好方法

转载 作者:行者123 更新时间:2023-11-29 03:45:01 24 4
gpt4 key购买 nike

我不是 MySQL 专家,但想在关系型 MySQL 表之上做类似对象层的事情。

我想要有很多“结构”,其中的字段类型为“bigint”、“longtext”、“datetime”、“double”,仅存储在 7 个表中。

entity_types (et_id, et_name) - “结构”列表;

entity_types_fields (etf_id, parent_et_id, ....., etf_ident, etf_type) - 存储在一个表中的所有结构的结构属性列表; etf_​​type 包含引用下面描述的 4 个表之一的 int 值 (0,1,2,3)。

entities (e_id, et_id) - 所有可用实体的列表(实体的 id 和类型 id)

和 4 个数据表(包含实体的所有数据)-

entities_props_bigint (parent_e_id, parent_etf_id, ep_data) - 用于 BIGINT 数据属性entities_props_longtext (parent_e_id, parent_etf_id, ep_data) - 用于 LONGTEXT 数据属性entities_props_datetime (parent_e_id, parent_etf_id, ep_data) - 用于 DATETIME 数据属性entities_props_double (parent_e_id, parent_etf_id, ep_data) - 用于 DOUBLE 数据属性

从此类数据层中进行选择的最佳方法是什么?

让我有一个 e_id 列表(实体的 ID),每个实体可以有任何类型。我想获得预定义的属性列表。如果某些实体没有这样的属性,我希望它等于 NULL。

你有关于如何做的一些信息吗?可能您有一些链接或已经处理过此类事情。

谢谢!

最佳答案

你是 reinventing the wheel通过在关系数据库之上实现整个元数据系统。众多开发者have tried to do what you're doing然后用SQL查询,就好像是关系数据一样。但是,在 SQL 中实现非关系数据和元数据系统比您预期的要难。

我已将您问题的relational 标记更改为eav,因为您的设计是Entity-Attribute-Value 的变体。设计。 Stack Overflow 中有五个标签的限制。但是您应该意识到您的设计不是关系型的。

关系设计必须为实体的所有实例提供一组固定的属性。在关系数据库中表示这一点的正确方法是使用表的列。这允许您为每个属性指定一个名称 和一个数据类型,并确保同一组名称及其数据类型适用于表的每一行。

What the best way to do selection from such data layer ?

查询您的设计的唯一可扩展方式是将属性数据和元数据作为行获取,并在应用程序代码中重建您的对象。

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)

在上面的查询中,每个实体字段最多匹配一个属性,其他数据列将为空。如果所有四个数据列都为空,则实体字段丢失。


关于您的评论,好吧,现在我更了解您要做什么了。您在树中有实体实例的集合,但每个实例可能是不同的类型。

以下是我的设计方式:

  • 将所有实体子类型共有的任何属性存储在一种父类(super class)型表中。

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

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

entity_books(e_id,isbn,pages,publisher,volumes, etc.)

entity_videos(e_id、格式、区域、光盘等)

entity_socks(e_id、 Fabric 、尺码、颜色等)

entity_paths(ancestor_e_id, descendant_e_id, path_length)

有关类表继承和闭包表的更多信息,请参阅我的演示文稿 Practical Object-Oriented Models in SQLModels for Hierarchical Data in SQL , 或者我的书 SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming ,或 Martin Fowler 的书 Patterns of Enterprise Application Architecture .

关于mysql - 做 MySQL 对象层的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7151521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com