[noob warning!] 我需要在一些表中存储一些数据,它类似于指向多态对象的指针数组。例如。 (伪C ++)
struct MyData { string name; }
struct MyDataA : MyData { int a,b,c; }
struct MyDataB : MyData { string s; }
MyData * data[100];
我真的不知道谷歌搜索输入了什么!你如何在SQL数据库中存储这样的信息?
我随意的想法:
答案 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可能完全不合适 - 我把它作为一个思想挑战者抛弃了。