2010-05-17 47 views
0

我工作的一个数据库,但我还挺新的这个所以我今天碰到了一个问题。 我有一些表格:OFFICE,ROOM,EMPLOYEE和DOCUMENT。文档必须指定发件人,可以是单个员工,整个房间或整个办公室,因此必须具有对这些表的主键的引用。 我应该做一个“平行”表来处理它(例如,我已经完成了一个处理多个收件人文档)还是有另一种方式? 谢谢多参考在SQL

+0

你可以发布更多关于您的架构,我还是不明白这一点,当然 – vodkhang 2010-05-17 15:13:31

+0

,我有3个表:办公室,房间和员工。他们有自己的ID(他们的主键)和一些列与其他信息。然后还有另一个表DOCUMENT,它有一个列,发件人,可以是其他表(例如单个员工,一个房间或整个办公室)中的一个,也可以是一个,所以我想让它指向另一个表的主键(因此,如果该文件是写的房间A2,id为ab34,我可以在“发件人”的地方写ab34,如果是员工凯文,id为kv45,我可以写kv45)。希望它有帮助 – AGarofoli 2010-05-19 12:13:48

回答

1

我会倾向于有一个外键,每个可以确保只有一个的值都将检查约束的三个表。这样,您仍然可以使用标准参照完整性。顺便说一句,这假定业务规则是每个文档必须有一个且只有一个发件人。

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) 
)
+0

是的,文档只能有一个发件人,所以我可能会使用检查约束解决方案。谢谢 – AGarofoli 2010-05-19 12:15:52

0

您正试图创建条件的外键,你不能在SQL Server执行。我认为创建一个表来保存文档和发件人是一个好主意,但是你将无法创建外键。尽管您可以实施Check Constraint来控制数据。

+0

我不太了解检查限制,但它似乎是最好的解决方案。感谢您的链接! – AGarofoli 2010-05-19 12:38:54

0

我会并行表,因为你提到的实现这一点。这些表是这样:

OfficeDocuments(OfficeID,DocumentID)

RoomDocuments(RoomID,DocumentID)

EmployeeDocuments(雇员,DocumentID)

您可以用设计设计更加灵活查询像这样,例如参加房间和办公室表格以获取雇员名单。

你选择应取决于你需要如何灵活的是方法。如果仅设计一个或两个查询来处理此表,则可以使用非规格化表(对于可以作为发件人的每种类型的表使用检查约束和多个属性)。

+0

我需要的唯一一个查询是让我检查谁写了一个文档,检查约束会比“并行表”方法更容易,但是你是对的,这是一个更灵活的解决方案。现在我不需要灵活,我可能需要尽快切换解决方案。 也许我会试试看,哪一个更好,谢谢! – AGarofoli 2010-05-19 12:31:02