【问题标题】:Storing polymorphic objects in SQL database在 SQL 数据库中存储多态对象
【发布时间】:2009-07-25 05:48:32
【问题描述】:

[菜鸟警告!] 我需要在一些表中存储一些数据,这些数据相当于指向多态对象的指针数组。例如。 (伪 C++)

struct MyData { string name; }
struct MyDataA : MyData { int a,b,c; }
struct MyDataB : MyData { string s; }
MyData * data[100];

我真的不知道要输入什么谷歌搜索!您将如何将此类信息存储在 SQL 数据库中?

我的随机想法:

  • 我可以有一个表,其列是结构标识符,然后有冗余列,但这似乎很浪费。
  • 我可以为每种结构类型创建一个表。这些将有一个外键返回到主数组表。但是,如何指向结构表?

【问题讨论】:

    标签: sql database-design


    【解决方案1】:

    确实有两种主要的方法可以解决这个问题:

    • 每种类型的表
    • 每个层次结构的表

    两者各有利弊。

    Table-per-type 为您提供更多表(每种类型一个),这些表仅存储直接超类中的“增量”。最坏的情况是,您需要将多个表连接在一起,以最终将所有数据放在一个类型的单个实例中。优点:由于您只将与该类型真正相关的内容存储到单独的表中,因此您可以在数据库表上设置 NOT NULL 限制等。

    Table-per-hierarchy 为您提供更少的表,但每个表代表一个完整的层次结构,因此它可能包含许多未填充的列(在表示基类类型的行中)。此外,在构成派生类的额外列上,您不能设置 NOT NULL 限制之类的东西 - 所有这些额外的列都必须可以为空,因为它们实际上不存在于基类中,因此您会失去一定程度的安全性在这里。

    自己看看 - 有两篇关于如何做到这一点的非常好的文章(在实体框架中,但这些原则适用于任何数据库和任何数据映射技术):

    希望这对您有所帮助并为您提供一些意见!

    马克

    【讨论】:

    • 谢谢,这有助于对数据进行建模。现在,当我有每种类型和多种类型的表时,如何进行查询。我是否必须将所有表与“基础”连接起来并查询每种类型?
    • 您打算如何访问您的数据? Entity Framework 以及更强大的 ORM(如 NHibernate)都将支持这种“开箱即用”——您只需要一个“东西”,然后您就可以从 OR-mapper 中得到正确的“东西”。跨度>
    • 如果您需要直接从 SQL 访问它,您必须以某种方式知道(或弄清楚)您需要什么类型并执行多个查询或联合查询来获取您的数据。或者:您可以为封装此 JOIN(或这几个 JOIN)的每种类型创建一个视图,然后您可以简单地从该视图中选择并获取所有例如学生或所有商科学生等。
    【解决方案2】:

    我使用 Hibernate 文档中的“table-per-sublcas”样式。

    您创建了一个 Person 表,其中包含您对某个人的所有了解以及 PersonID。然后您制作一个客户表,其中仅包含客户独有的数据(帐户余额等)。将 PersonID 放入 Customer 表中。 WebsiteUser 中可能有一个 CustomerID,依此类推。

    映射 IS-A 继承关系的一对一关系。

    【讨论】:

      【解决方案3】:

      一种可能性是存储数据的 XML 字段,这允许搜索和检索,同时也相对容易序列化。 (问题是 SQL,但没有指定特定的供应商数据库,因此 XML 可能不适用于每个 DB 解决方案。)

      编辑:我要警告这一点,因为尚不完全清楚需要存储/检索/用途等内容,因此 XML 可能完全不合适 - 我将其作为一个思考者扔在那里。

      【讨论】:

      • 我有一个“实时”数据流,我想过滤到数据库中。数据库是 SQLite (ADO)。 XML 会太慢(编组)并创建大量 (GB) 文件。 XML 是源数据的来源。
      猜你喜欢
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 2013-01-10
      • 2019-09-17
      • 2019-09-15
      • 2016-07-18
      • 1970-01-01
      相关资源
      最近更新 更多