题
我的数据库中有两个表:
- 公司表(ID、公司名称、公司用户名、公司密码)
- 员工表(ID、公司ID、姓名、用户名、密码)
现在我正在设计一个内部邮件系统,员工可以互相写信,也可以直接写信到公司帐户。
我的内部邮件表有以下字段:
- ID
- 发件人ID
- 目标ID
- 信息
- ...
现在我的问题出现了,当我用 ID(发件人/收件人)填充消息表时,我不知道消息是来自公司还是员工,因为 ID 可能存在于两个表中。
我的解决方案可能是什么?
更新
上面的例子是为了简化我的问题。
员工和公司表不包含用户名或密码,但包含对 ASP.NET 成员资格的引用 uniqueidentifier
用于管理登录。正如下面建议的使用 UI 来控制发件人和接收者,我使用 ASP.NET 成员资格控制器中的 UI。谢谢。:-)
解决方案
在 Company 和 Employee 表中使用 uniqueidentifier 作为 id,并使用 newid() 作为默认值。
或者,合并表并添加一个字段来显示记录是公司还是员工。
其他提示
您可以使用两个外键,一个用于公司,一个用于员工,并确保只设置一个。
所以 email.ToID 可以指employee.ID 或company.ID,对吗?您不能以声明方式限制 email.ToID 必须至少存在于(employee.ID 或 company.ID)之一中。几个解决方案:
- 电子邮件表中有 ID(ToEmployeeId、ToCompanyId),以及一个检查约束,该约束限制在给定电子邮件上只能指定一个。
- 将员工 ID 和公司 ID 放在同一 ID 空间中,例如他们的Id掌握在某种Contact表中,然后company.Id和employee.Id都有一个FK引用Contact.Id。我认为这个解决方案不是很好,因为 Contact 是这些其他表的一个非常蹩脚的超级类型。
- 有一个联系人表,例如(ContactId、EmployeeId、CompanyId)。当邮件发送到 EmployeeId=X 时,您会查找 EmployeeId=X 的联系人行。如果不存在,则创建它并使用新的 ContactId。Companyid 也是如此。这确实允许您将来也可以扩展使用其他 Id 集
不隶属于 StackOverflow