我正在使用Sql Server 2012处理数据库。在我们的数据模型中,我们有一种User
类型,包含基本登录信息,名称,地址等等。其中一些用户将是{ {1}} s,具有与Technician
相同的所有属性,但有一些其他属性,如User
,Route
等。
我的问题是,在设计数据库时,如何模拟这种情况。我想到了两个选择。
Ship To Location
表中的外键添加到Technician
数据库的PK中以将其链接起来。我对这个问题的担心是如何知道用户是否是技术人员,每次用户登录时我都必须在技术人员表上运行查询。User
表中的字段与技术人员数据库的PK链接,如果此字段为空,或-1或我知道此用户不是技术人员。我没有看到这个问题的任何直接问题,但我不是数据库设计方面的专家。这些中的任何一个都有优势吗?如果有,为什么?目前我有两个不同的表,两个完全不同的ID,它们没有任何关联,我现在面临的问题是因为。
答案 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。它将列出一些选项。