2

我正在使用 Sql Server 2012 开发数据库。在我们的数据模型中,我们有一个 类型User,具有基本的登录信息、姓名、地址等。其中一些用户将是Technicians,他们具有与a User,但还有一些其他属性,例如Route,Ship To Location等。

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

  1. 在表中有一个外键Technician到数据库的 PKUser以将它们链接起来。我对此的担心是我如何知道用户是否是技术人员,每次用户登录时我都必须在技术人员表上运行查询。
  2. 将表中的一个字段User与 Technician 数据库的 PK 链接起来,如果此字段为空,或者 -1 或我知道该用户不是技术人员的任何内容。我没有看到任何直接的问题,但我不是数据库设计方面的专家。

这些中的任何一个都有优势吗?如果有,为什么?目前我有 2 个不同的表,有两个完全不同的 id,它们没有以任何方式链接,因此我现在面临问题。

4

2 回答 2

2

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

用户类型ID

1=技术员

2=机械师

3=会计师

编辑1

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
    )
于 2013-10-23T01:43:49.363 回答
1

您可能想熟悉 ORM 的操作方式。即使您不使用 ORM。它将列出一些选项。

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

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

于 2013-10-23T01:52:21.667 回答