sqlserver中数据库的继承

sqlserver中数据库的继承,sql,sql-server,sql-server-2008,sql-server-2008-r2,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2008 R2,Sql Server 2012,我要做一个项目,我有 任务实体可以有几种类型的任务,假设它们都有不同的字段。那么如何在sql中管理这种方法呢 像这样 Task ( abstract class ) Change Engine Oil ( child class ) Meet James ( child class ) 因此,在上述情况下,每个子类都有不同类型的属性您可以考虑从两个表开始—Tasks和TaskEntityDetails Tasks表将有两列—TaskID(主键)和Task TaskEnti

我要做一个项目,我有

任务实体
可以有几种类型的任务,假设它们都有不同的字段。那么如何在sql中管理这种方法呢

像这样

   Task ( abstract class ) 
   Change Engine Oil ( child class ) 
   Meet James ( child class )

因此,在上述情况下,每个子类都有不同类型的属性

您可以考虑从两个表开始—Tasks和TaskEntityDetails

Tasks表将有两列—TaskID(主键)和Task

TaskEntityDetails表将有4列—ID(主键)、TaskID(外键)、字段和值

字段列将TaskID的所有字段存储在行中,而不是作为单独的列。 值列将具有与每个TaskID的字段对应的值

您的桌子将如下所示:

ID    TaskID    Field         Value
1     1         StartDate     2014-01-01
2     1         EndDate       2014-01-31
3     1         Contact       ABC
4     2         StartDate     2014-01-01
5     2         TaskName      XYZ

然后,当您想要检索数据时,可以使用
PIVOT
操作符。这样,您就可以避免在表中有一些空值。

如果我们考虑了您的解决方案,那么我们将把几乎所有的数据都放在 TaskTyTyNothEng/<代码>表中。这是一个好的实践吗?我建议的是从基本结构开始。您可以一直使用单独的字段表,并将字段的键放在主表中。与TaskID类似,您将使用FieldID(外键)代替Field,并且将有一个单独的表字段,其中包含两列—FieldID(主键)和Field Name。上面提到的表将保留为您的主数据表,类似于数据仓库中的事实表。谢谢,我更喜欢第一个表,因为第二个方法将为每个任务查询增加一个联接。无论如何,谢谢