2010-05-17 5 views
0

Я работаю над db, но я новичок в этом, поэтому сегодня я столкнулся с проблемой. У меня есть несколько таблиц: OFFICE, ROOM, EMPLOYEE и DOCUMENT. Документ должен указывать отправителя, который может быть одним сотрудником, всей комнатой или целым офисом, поэтому он должен иметь ссылку на первичные ключи этих таблиц. Должен ли я делать «параллельную» таблицу для ее обработки (например, я сделал один для обработки документов с несколькими получателями) или есть другой способ? СпасибоНесколько ссылок в SQL

+0

Можете ли вы разместить дополнительную информацию о своей схеме, я до сих пор ее не знаю – vodkhang

+0

, конечно, у меня 3 стола: ОФИС, КОМНАТА и РАБОТА. они имеют свой собственный идентификатор (их первичный ключ) и некоторые столбцы с другой информацией. Тогда есть еще одна таблица, DOCUMENT, у которой есть столбец, отправитель, который может быть одним и только одним, из других таблиц (например, одного сотрудника, комнаты или всего офиса), поэтому я хотел, чтобы он ссылался на другой (так что если документ был написан комнатой A2, чей id ab34, я могу написать ab34 в месте «отправителя», если это был сотрудник Кевин, чей id kv45, я могу написать kv45). надеюсь, что это поможет – AGarofoli

ответ

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

0

Вы пытаетесь создать условные внешние ключи, которые вы не можете сделать в SQL Server. Я думаю, что создание таблицы для хранения документа и отправителя - хорошая идея, но вы не сможете создавать внешние ключи. Вы можете реализовать Check Constraint, хотя для управления данными.

+0

Я не слишком хорошо разбираюсь в контроле, но это лучшее решение. Спасибо за ссылку! – AGarofoli

0

Я бы реализовал это с помощью параллельных таблиц, как вы упомянули. Таблицы были бы как таковой:

OfficeDocuments (OfficeID, DocumentID)

RoomDocuments (RoomID, DocumentID)

EmployeeDocuments (EmployeeID, DocumentID)

Вы можете создавать более гибкие запросы с дизайном например, присоединиться к столам Room и Office, чтобы получить список сотрудников.

Метод, который вы выбираете, должен зависеть от того, насколько вы гибки. Если вы разрабатываете только один запрос или два, чтобы идти вместе с этой таблицей, может иметь смысл иметь вместо этого денормализованную таблицу (используя контрольные ограничения и несколько атрибутов для каждого типа таблицы, который может быть отправителем).

+0

Единственный запрос, который мне нужен, - это тот, который позволяет мне проверить, кто написал документ, ограничение проверки упростит процедуру «параллельных таблиц», но вы правы, это более гибкое решение. На данный момент мне не нужно быть гибким, мне может потребоваться скорое решение. Наверное, я попробую оба и посмотрю, какой из них лучше работает, спасибо! – AGarofoli

Смежные вопросы