我们正在使用L2S,我们有一个这样的类:
public class HumanContainer
{
public List<IHuman> Humans { get; set; }
public string SomeOtherProperty { get; set; }
}
我们的数据库有这样的表格:
HumanContainer
- 极客
到目前为止,我们只有一种类型的人(Geek)。当我们向DB发送/检索HumanContainers时,我们知道将它们视为极客。现在我们需要第二个人(运动员),我们可以选择如何实现这一点。
一个选项是在DB中创建另一个表(Athlete):
HumanContainer
- 极客
- 运动员
对于像这样的每个新的具体人类,我们需要遍历HumanContainer.Humans,检测类型,将其添加到适当的EntitySet&lt;&gt;,然后保存。
另一种选择是只为所有人提供一张桌子:
HumanContainer
- 人类
如果我们这样做,那么我们需要类似XML列的内容,我们将Human序列化为其特定类型并将其存储在该列中。然后我们需要在检索数据时反序列化该列。
推荐的方法之一是什么?我很想知道人们是如何处理这种情况的。我还没有列出第三种方法吗?
答案 0 :(得分:1)
您尝试做的事情是代表关系数据库中的继承。 Guy Burstein有一篇关于此主题的精彩文章:How To: Model Inheritance in Databases和Linq to SQL Inheritance。
答案 1 :(得分:1)
正如我理解你的问题一样,在你的情况下将来可能有不同类型的人。您可以尝试以下解决方案。
解决方案1:
正如您所提到的,只在数据库'Humas'中创建一个表,并将Human序列化为特定的Type并将其存储在该列中,并在检索数据时反序列化该列。这个解决方案似乎很好,因为如果将来需要任何Human类型,我们不需要更改数据库设计。并且易于管理。
但是这个解决方案的缺点是,如果应用程序只需要Geek Humans类型,那么首先需要检索列数据并反序列化它,之后我们可以找到Geek Human类型。
解决方案2:
在数据库中创建两个表。 1)HumanType:用于保存人类的类型(极客,运动员或任何其他类型) 2)人类:存储人类信息。该表包含HumanType的引用键。
此解决方案的优点是您可以根据需求轻松启动查询(例如,只能从表中轻松获取Geek Type Human)。如果有任何新的人类类型,那么输入人类数据库需要一个条目。