在SQL数据库中存储多态对象

时间:2009-07-23 16:21:59

标签: sql database-design

[noob warning!] 我需要在一些表中存储一些数据,它类似于指向多态对象的指针数组。例如。 (伪C ++)

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

我真的不知道谷歌搜索输入了什么!你如何在SQL数据库中存储这样的信息?

我随意的想法:

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

4 个答案:

答案 0 :(得分:3)

这是一个复杂的话题。为了了解所涉及的策略,我建议您阅读有关此主题的Hibernate文档:

http://docs.jboss.org/hibernate/stable/core/reference/en/html/inheritance.html

即使你没有使用Hibernate,关系映射概念仍然是相关的。请注意,Hibernate并没有规定任何一种策略,因为没有一种方法比其他方法更好。

答案 1 :(得分:2)

我从Hibernate文档中执行“table-per-sublcass”风格。

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

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

答案 2 :(得分:2)

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

  • 表每次型
  • 表每层次结构

它们中的任何一个都有其优点和缺点。

Table-per-type为您提供了更多的表(每种类型一个),它只存储来自直接超类的“delta”。最糟糕的情况是,您需要将多个表连接在一起,以便最终将所有数据合并为一个类型的单个实例。优点:由于您只将与该类型真正相关的内容存储到一个单独的表中,您可以像在数据库表上设置NOT NULL限制等那样执行此操作。

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

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

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

马克

答案 3 :(得分:1)

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

编辑:我要告诫这一点,因为它不完全清楚需要存储/检索/目的等等,因此XML可能完全不合适 - 我把它作为一个思想挑战者抛弃了。