我工作的一个数据库,但我还挺新的这个所以我今天碰到了一个问题。 我有一些表格:OFFICE,ROOM,EMPLOYEE和DOCUMENT。文档必须指定发件人,可以是单个员工,整个房间或整个办公室,因此必须具有对这些表的主键的引用。 我应该做一个“平行”表来处理它(例如,我已经完成了一个处理多个收件人文档)还是有另一种方式? 谢谢多参考在SQL
多参考在SQL
回答
我会倾向于有一个外键,每个可以确保只有一个的值都将检查约束的三个表。这样,您仍然可以使用标准参照完整性。顺便说一句,这假定业务规则是每个文档必须有一个且只有一个发件人。
Create Table Document
(
SenderEmployeeId ...
, SenderRoomId ...
, SenderOfficeId....
, Constraint CK_Document_SingleSender Check (Case
When SenderEmployeeId Is Not Null And SenderRoomId Is Null And SenderOfficeId Is Null Then 1
When SenderRoomId Is Not Null And SenderEmployeeId Is Null And SenderOfficeId Is Null Then 1
When SenderOfficeId Is Not Null And SenderEmployeeId Is Null And SenderRoomId Is Null Then 1
Else 0
End = 1)
)
是的,文档只能有一个发件人,所以我可能会使用检查约束解决方案。谢谢 – AGarofoli 2010-05-19 12:15:52
您正试图创建条件的外键,你不能在SQL Server执行。我认为创建一个表来保存文档和发件人是一个好主意,但是你将无法创建外键。尽管您可以实施Check Constraint来控制数据。
我不太了解检查限制,但它似乎是最好的解决方案。感谢您的链接! – AGarofoli 2010-05-19 12:38:54
我会并行表,因为你提到的实现这一点。这些表是这样:
OfficeDocuments(OfficeID,DocumentID)
RoomDocuments(RoomID,DocumentID)
EmployeeDocuments(雇员,DocumentID)
您可以用设计设计更加灵活查询像这样,例如参加房间和办公室表格以获取雇员名单。
你选择应取决于你需要如何灵活的是方法。如果仅设计一个或两个查询来处理此表,则可以使用非规格化表(对于可以作为发件人的每种类型的表使用检查约束和多个属性)。
我需要的唯一一个查询是让我检查谁写了一个文档,检查约束会比“并行表”方法更容易,但是你是对的,这是一个更灵活的解决方案。现在我不需要灵活,我可能需要尽快切换解决方案。 也许我会试试看,哪一个更好,谢谢! – AGarofoli 2010-05-19 12:31:02
- 1. 多参考
- 2. 多线程参考?
- 3. IS参考参考在C++?
- 4. 在html中添加更多参考输入参考
- 5. SQL报告服务参考
- 6. 刷新SQL Server参考
- 7. 显示参考列SQL
- 8. SQL Server参考计算列
- 9. 制作参考通过SQL
- 10. SQL参考integerity递归
- 11. 参考透视型游标在PL/SQL
- 12. Simba DB SQL参考在哪里?
- 13. Excel /多个参考标准
- 14. VSCode多个项目参考
- 15. MySQL的多个ID参考
- 16. 防止jQuery多重参考
- 17. 多个表名参考
- 18. 多维阵列参考
- 19. 参考多个工作表
- 20. 参考在XSD
- 21. 参考在Java
- 22. 参考在foreach
- 23. 参考在Java
- 24. 参考在C++
- 25. C++参考shared_ptr vs参考
- 26. NHibernate的多对多的参考帮助
- 27. 参考从主键多到许多表
- 28. SQL挑战 - 使用多个参考日期进行中断
- 29. C++参考和参考参数
- 30. 参考参数
你可以发布更多关于您的架构,我还是不明白这一点,当然 – vodkhang 2010-05-17 15:13:31
,我有3个表:办公室,房间和员工。他们有自己的ID(他们的主键)和一些列与其他信息。然后还有另一个表DOCUMENT,它有一个列,发件人,可以是其他表(例如单个员工,一个房间或整个办公室)中的一个,也可以是一个,所以我想让它指向另一个表的主键(因此,如果该文件是写的房间A2,id为ab34,我可以在“发件人”的地方写ab34,如果是员工凯文,id为kv45,我可以写kv45)。希望它有帮助 – AGarofoli 2010-05-19 12:13:48