【发布时间】:2018-09-16 16:50:19
【问题描述】:
我的数据库中有三个表:Contacts(主表)、Users 和 Staff。 Contacts 表有一个主键,它作为Users 和Staff 表的外键引用。
联系人
ContactID (Primary Key)
First Name
Last Name
Email
用户:
ContactID (Foreign Key)
Username
Password
员工:
ContactID (Foreign Key)
Position
Comments
使用INNER JOIN 从这些表中提取数据相当简单,这取决于您需要从Users 或Staff 表中获取哪些数据。更新和插入新记录是我不确定采用哪种方法的事情。
由于Contacts 表是我的主表并拥有唯一ID,但同时在Users 和Staff 之间共享,我不确定这种情况。
假设我想输入新的用户记录。我需要在Contacts 表中输入名字、姓氏和电子邮件,在Users 表中输入用户名和密码。同时,我必须检查 Contacts 表中是否已经存在 First、Last name 和 email,因为之前可能已经为 Staff 记录输入了这条 Contact 记录。
我不确定如何防止重复,但同时可能存在同名的用户或员工。如果电子邮件已存在于联系人表中,我是否应该通过电子邮件限制/过滤并且不让他们输入记录?或者有没有更好的方法来处理这个?
拥有三个表的全部意义在于防止出现冗余数据,因为 User 可能是 Staff,但如果有意义的话,Staff 可能不是 User。如果有人可以帮助我选择最好的方法,请告诉我。谢谢
【问题讨论】:
-
通过阅读您的帖子,我不完全确定需要 3 个表。事实上,实际上可能只有一张桌子。 Contact、User 和 Staff 之间的关系是 1 对 1 的吗?如果联系人可以是员工,但不能是用户,那么为什么不允许用户特定的列可以为空,反之亦然? (假设员工也可以是用户)。
-
@Larnu 如果我理解您的评论,您建议将所有数据存储在一个表中。然后有一个字段来标记用户是否是员工。对吗?
-
这是一种选择,是的,如果我的理解是正确的。
-
@DaveCullum 这是相关但不同的主题,因为我询问了设计,这里更多的是如何处理插入/更新语句。
标签: sql sql-server database sql-server-2008 database-design