Sql 数据库父级->;“儿童”;“长子”;关系

Sql 数据库父级->;“儿童”;“长子”;关系,sql,sql-server,entity-framework,Sql,Sql Server,Entity Framework,我有一个数据库设计问题。为了说明我的问题,想象一下: 简单的父->子关系: [Parent] 1-----* [Children] 现在,每一位父母(妈妈或爸爸)都有一个长子。我需要一个强大的关系数据库从父母到第一个孩子 [Parent] 1-----1 [Children] 我可以简单地将FirstbornChildId添加到父表中,但我不喜欢这种方法,因为它可能导致数据不一致。(FirstbornChildId链接到一个ParentId链接到另一个父项的子项…) 实体框架应该映射关系,这

我有一个数据库设计问题。为了说明我的问题,想象一下:

简单的父->子关系:

[Parent] 1-----* [Children]
现在,每一位父母(妈妈或爸爸)都有一个长子。我需要一个强大的关系数据库从父母到第一个孩子

[Parent] 1-----1 [Children]

我可以简单地将FirstbornChildId添加到父表中,但我不喜欢这种方法,因为它可能导致数据不一致。(FirstbornChildId链接到一个ParentId链接到另一个父项的子项…)

实体框架应该映射关系,这样每个父实体都有一个链接到特定子实体的FirstBornity属性

在Microsoft SQL 2008 R2中有什么好方法可以实现这一点吗?

两种可能的解决方案 三张表:

  • 父表
  • 子表
  • FirstBorns表
    • 父项中的id
    • 儿童身份证


列是Children表(Y/N或1/0)中的第一个

我认为您的方法很好。您必须防止应用层中的数据损坏。对于数据库约束,您只能做这么多。您至少可以为FirstbornChildId设置一个外键,以确保子项确实存在(无论父项是什么)


这个“firstborn”属性无论如何都是非规范化的:它可以从孩子的“birthdate”属性中派生出来。我很感激您出于性能原因而希望显式存储它,而且它没有问题。但是,如果您想让数据库完全处理完整性,这确实会让事情变得棘手。

“但我不喜欢这种方法,因为它可能会导致数据不一致。”这两种方法如何解决这个问题?我发现三表解决方案太复杂,无法管理,而第二种方法我认为无法在T-SQL中创建外部关系。(在马哈茂德指出的问题旁边)@thilo我认为唯一可能的方法是使用触发器。您可以在Children表中放置一个“dateBorn”字段,并创建一个计算列“isFirstBorn”,该列使用parentId检查dateBorn,以确定哪个孩子是长子。这将确保每个家长只有一个孩子是firstborn==true。@Tundey:那太好了。sql server有这样的功能吗?请注意,它是一个计算列,其值来自多行查询。有趣的是……这与我在上面的评论中发布的解决方案相同。无论如何,如果您使用计算列的思想,我相信SQL Server可以让您指定存储计算列,这样就不会在每次请求数据时都计算计算列。这将解决性能问题。这里有另一个复杂的想法:Child有一列“firstborn\u parent\u id”。它可以是空的。如果不为null,则必须将其设置为与“parent_id”相同的值(这应该是可约束的),这意味着该子对象是长子。然后在“firstborn\u parent\u id”(稀疏,因此可以有多个null)上创建一个唯一的稀疏索引。