gpt4 book ai didi

mysql - 如何在数据库中存储具有动态数量属性的数据

转载 作者:IT老高 更新时间:2023-10-28 23:52:16 29 4
gpt4 key购买 nike

我有许多具有不同数量属性的不同对象。到目前为止,我已经将数据保存在 XML 文件中,这很容易允许不断变化的属性数量。但我正在尝试将其移至数据库。

您首选的存储这些数据的方式是什么?

目前我已经确定的一些策略:

  • 在对象的表中有一个名为“attributes”的字段,并在其中存储序列化或 json 化的数据。
  • 将数据存储在两个表(对象、属性)中并使用第三个表来保存关系,使其成为真正的 n:m 关系。非常干净的解决方案,但获取整个对象及其所有属性可能非常昂贵
  • 识别所有对象共有的属性,并为这些对象的表创建字段。将剩余的属性作为序列化数据存储在另一个字段中。这比第一种策略有优势,使搜索更容易。

有什么想法吗?

最佳答案

如果您曾经计划搜索特定属性,那么将它们序列化为单个列是一个坏主意,因为您必须使用每行函数来获取信息 - 这个很少能很好地扩展。

我会选择你的第二个选择。在属性表中有一个属性列表,在它们自己的表中拥有对象,以及一个称为对象属性的多对多关系表。

例如:

objects:
object_id integer
object_name varchar(20)
primary key (object_id)
attributes:
attr_id integer
attr_name varchar(20)
primary key (attr_id)
object_attributes:
object_id integer references (objects.object_id)
attr_id integer references (attributes.attr_id)
oa_value varchar(20)
primary key (object_id,attr_id)

注意到您对性能的担忧,但根据我的经验,拆分一列总是比合并多列成本更高。如果事实证明存在性能问题,出于性能原因破坏 3NF 是完全可以接受的。

在这种情况下,我会以相同的方式存储它,但也会有一列包含原始序列化数据。如果您使用插入/更新触发器来保持列数据和组合数据同步,那么您不会有任何问题。但在实际问题浮出水面之前,您不必担心这一点。

通过使用这些触发器,您可以将所需的工作降至在数据更改时。通过尝试提取子列信息,您对每个选择都做了不必要的工作。

关于mysql - 如何在数据库中存储具有动态数量属性的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1444462/

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