模拟数据库中的继承

时间:2013-10-22 23:34:34

标签: sql sql-server database

我正在使用Sql Server 2012处理数据库。在我们的数据模型中,我们有一种User类型,包含基本登录信息,名称,地址等等。其中一些用户将是{ {1}} s,具有与Technician相同的所有属性,但有一些其他属性,如UserRoute等。

我的问题是,在设计数据库时,如何模拟这种情况。我想到了两个选择。

  1. Ship To Location表中的外键添加到Technician数据库的PK中以将其链接起来。我对这个问题的担心是如何知道用户是否是技术人员,每次用户登录时我都必须在技术人员表上运行查询。
  2. User表中的字段与技术人员数据库的PK链接,如果此字段为空,或-1或我知道此用户不是技术人员。我没有看到这个问题的任何直接问题,但我不是数据库设计方面的专家。
  3. 这些中的任何一个都有优势吗?如果有,为什么?目前我有两个不同的表,两个完全不同的ID,它们没有任何关联,我现在面临的问题是因为。

2 个答案:

答案 0 :(得分:2)

假设您有3种不同的子类类型的用户。您可以在User表中有一列来标识子类Type。例如UserTypeID。如果可能的值太多,您可以创建新表来存储这些userTypes。

UserTypeID

1 =技术员

2 =技工

3 = Accounttant

EDIT1

UserTypeID将存在于所有子类实体中。 另外,从其他评论中我感到很担心如何使数据不同步而没有明确的RI约束。只是想确保此列值不应来自应用程序代码或用户,而是sql API插入记录应根据哪个子类实体获取插入记录找出正确的值。

例如Pr_InsertUser API插入新技术人员。此插入API首先找出为什么我是技术人员的UserTypeId并将记录插入到类用户并获取用户ID。然后将userId和UserTypeId传递给子类技术员,调用另一个私有sql API Pr_Insert_Technician来插入更多属性。

所以我想说的是,SQL不支持从多个表到单个表的显式FK,这应该在SQL API中注意。

    Declare @user Table
    (
        userid          int
        ,UserTypeID     Tinyint
        ,username       sysname
        ,userAddress    sysname
    )

    Declare @Technician Table
    (
        userid      int
        ,UserTypeID Tinyint
        ,attr1      sysname
        ,attr2      sysname
    )

    Declare @Mechanic Table
    (
        userid      int
        ,UserTypeID Tinyint
        ,attr3      sysname
        ,attr4      sysname
    )

    Declare @Accounttant Table
    (
        userid      int
        ,UserTypeID Tinyint
        ,attr2      sysname
        ,attr4      sysname
    )

答案 1 :(得分:1)

您可能想要熟悉ORM的做法。 即使您不使用ORM。它将列出一些选项。

http://nhibernate.info/doc/nh/en/#inheritance

http://ayende.com/blog/3941/nhibernate-mapping-inheritance