Двухсторонние отношения (недостаток проектирования базы данных) - PullRequest
2 голосов
/ 09 марта 2011

У меня есть две таблицы, которые связаны друг с другом через отношение один ко многим. проблема в том, что у ссылочной таблицы также есть внешний ключ второй таблицы!

Я знаю, что это сбивает с толку, поэтому я покажу вам простой дизайн моей базы данных:

Авторы

AuthorId      Name       DefaultBookId (FK)
--------      -------    -------------
1             John       1
2             Mike       3
3             Mig        5

Книга

BookId        Title            AuthorId (FK)
--------      -------          -------------
1             TitleInfo1       1
2             TitleInfo2       3
3             TitleInfo3       2
4             TitleInfo4       1
5             TitleInfo5       3
6             TitleInfo6       3
7             TitleInfo7       1

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

Теперь обе таблицы зависят друг от друга, поэтому я не могу удалить какой-либо элемент, если не удалю связь между ними, и он не считает, что это правильно!

Есть идеи о том, является ли этот дизайн ошибочным или нет, и что я могу с этим поделать?

Ответы [ 3 ]

2 голосов
/ 09 марта 2011

Я бы реализовал это с 3-ей таблицей, которая объединяет две другие. Вы бы в итоге:

Авторы

AuthorId      Name   
--------      -------
1             John   
2             Mike   
3             Mig    

DefaultBook

AuthorId      DefaultBookId (FK)
--------      -------------
1             1
2             3
3             5

Книга

BookId        Title            AuthorId (FK)
--------      -------          -------------
1             TitleInfo1       1
2             TitleInfo2       3
3             TitleInfo3       2
4             TitleInfo4       1
5             TitleInfo5       3

Установив УНИКАЛЬНОЕ ограничение на DefaultBook.AuthorId, вы можете запретить каждому автору иметь более одного значения по умолчанию. Если вам нужно удалить автора, просто удалите его по умолчанию и все книги, связанные с ним, тогда вы можете удалить автора.

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

1 голос
/ 09 марта 2011

В принципе, этот дизайн в порядке, но, конечно, вы уже нашли проблему в практике.

Вот несколько вещей, которые вы можете попробовать:

  • , если ваша база данных поддерживает это (оракул делает), ваши ограничения будут отложены. Это будет проверять только ограничения на фиксацию, поэтому вы можете удалить книгу и ее автора за одну транзакцию. (con: очень специфично для базы данных)

  • вместо author.defaultBookId используется book.isAuthorsDefaultBook. .

  • отмените ненулевое ограничение для defaultBookId и доверите, что ваше приложение сделает это правильно (con: потеря некоторых возможностей базы данных)

Пояснение:

Отмена ограничения not null на defaultBookId позволяет установить для него значение null, удалить ранее указанную книгу, а затем удалить автора. Для создания то же самое работает, но в обратном порядке.

1 голос
/ 09 марта 2011

Вы можете удалить DefaultBookId из авторов, добавить столбец IsDefaultForAuthor в Книги, а затем применить ограничение, чтобы у каждого автора была только одна книга, помеченная как IsDefaultForAuthor.

Конечно, это не относится к таким проблемам, как книги, авторы которых написаны несколькими авторами, но я предполагаю, что вы представляете этот игрушечный пример, а не реальную модель вашей модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...