当前位置: 首页 > 面试题库 >

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

史英睿
2023-03-14
问题内容

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

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

到目前为止,我已经确定了一些策略:

  • 在对象表中只有一个名为“属性”的字段,并在其中存储序列化或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是完全可以接受的。

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

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



 类似资料:
  • 问题内容: 我想做类似Python在应用程序引擎上支持的Expando模型的事情。 有时您不想提前声明属性。特殊的模型子类Expando更改其实体的行为,以便将分配的所有属性(只要它不以下划线开头)都保存到数据存储区。 如何在Go中执行此操作? 问题答案: 事先注意: 有2个API。具有导入路径的那个使用通道作为参数。具有导入路径的另一个使用切片。根据您的情况调整以下示例。 具有动态属性的实体的关

  • 我是android studio的初学者,希望在room数据库中存储语言数组列表。有人能建议我怎么做吗?

  • 我创建了一个TextView,它以多行显示值 ,我希望将该值保留在SQLite数据库中。这是我使用的代码: 问题是当我保存值时,整个值被插入到一个单元格中。我希望每行的值分开,然后插入到每行的单个单元格中,尽管我使用扫描器方法插入数据,但它不起作用。那有什么办法吗?

  • 我是Spring Data JPA的新手。我试图为存储库创建一个自定义方法,但是它确实抛出了一个异常。以下是我目前的实现: 这是我启动应用程序时发生的异常(我正在使用 Spring 启动)。

  • 问题内容: 因此,在C ++ / C#中,您可以创建标志枚举来保存多个值,并且在数据库中存储单个有意义的整数当然是微不足道的。 在Java中,您有EnumSets,这似乎是在内存中传递枚举的一种很好的方法,但是如何将组合的EnumSet输出为整数进行存储?还有另一种方法可以解决这个问题吗? 问题答案:

  • 我的MySQL数据库中有四个表。 订单 项目 Orders_Items 客户 订单表 订单ID客户ID 项目表 item_id item_name item_price item_quantity orders_items表 order_item_id order_id item_id 客户表 customer_id customer_name 我想显示一个表,该表列出订单表中的所有订单,并将所有