2009-07-23 79 views
0

[noob warning!]我需要在某些表中存储一些数据,它就像是指向多态对象的指针数组的等价物。例如。 (pseudo C++)在SQL数据库中存储多态对象

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

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

我的杂感:

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

回答

1

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

编辑:我要告诫,因为尚不完全清楚需要存储什么/检索/目的等,所以XML可能完全不合适 - 我把它作为一个思想挑衅者来抛弃它。

+0

我有一个“实时”数据流,我想过滤到数据库中。数据库是SQLite(ADO)。 XML会太慢(编组)并创建大量(GB)文件。 XML是源数据的来源。 – Nick 2009-07-24 09:14:34

2

我从Hibernate文档中执行“每表sublcass”风格。

您制作了一张Person表格,其中包含您了解某人的所有信息以及PersonID。然后,您创建一个客户表,只有客户独有的数据(账户余额等)。将PersonID放入Customer表中。 WebsiteUser可能有一个CustomerID,等等。

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

1

有真正两种主要方式来解决这个问题:

  • 的table-per-型
  • 表每个层次

其中一方都有其优点和缺点。

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

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

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

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

Marc

+0

谢谢,这有助于建模数据。现在,当我有每种类型和多种类型的表时,我该如何进行查询。我是否必须将所有表格与“基础”连接起来并查询每种类型? – Nick 2009-07-25 15:30:40