Таблица, на которую ссылаются другие таблицы, имеющие разные PK - PullRequest
1 голос
/ 23 ноября 2011

Я хотел бы создать таблицу под названием «ЗАМЕЧАНИЯ».Я думал, что эта таблица будет содержать VARCHAR "table_name" (100), который указывает, какую таблицу помещают в заметку, столбцы "key" или несколько "key", представляющие значения первичного ключа таблицы, к которой относится это примечание, и a "примечание "поле VARCHAR (MAX).Когда другие таблицы используют эту таблицу, они предоставляют свои первичные ключи и свои «имя_таблицы» и получают все примечания, связанные с первичными ключами, которые они предоставили.Проблема в том, что в других таблицах может быть 1, 2 или более ПК, поэтому я ищу идеи о том, как я могу спроектировать это ...

Ответы [ 3 ]

3 голосов
/ 23 ноября 2011

То, что вы предлагаете, звучит для меня немного запутанно.Я бы предложил что-то вроде этого.

Notes
------
Id - PK
NoteTypeId - FK to NoteTypes.Id
NoteContent
NoteTypes
----------
Id - PK
Description - This could replace the "table_name" column you suggested
SomeOtherTable
--------------
Id - PK
...
Other Columns
...
NoteId - FK to Notes.Id 

Это позволит вам лучше нормализовать ваши данные, но при этом получить взаимосвязь между данными, которые вы хотите.Обратите внимание, что это предполагает отношение 1: 1 между строками в других ваших таблицах и Notes.Если это отношение будет много к одному, вам понадобится кросс-таблица.

Посмотрите эту тему о нормализации базы данных

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

1 голос
/ 23 ноября 2011

Вместо того, чтобы помещать другие имена таблиц и первичные ключи в эту таблицу, используйте первичный ключ таблицы NOTES - NoteId. Создайте FK в каждой другой таблице, которая будет делать заметки, и сохраните соответствующие NoteId в других таблицах. Затем вы можете просто присоединиться к NoteId из всех этих других таблиц к таблице NOTES.

0 голосов
/ 23 ноября 2011

Как я понимаю, ваша проблема заключается в том, что вы пытаетесь "абстрагировать" аудит нескольких таблиц таким образом, чтобы вы могли абстрагировать класс в ООП.

Хотя это отличный принцип разработки ООП, он падаетквартира в базах данных по нескольким причинам.Возможно, самой большой причиной является то, что, если вы не можете себе это представить, никому (даже вам), просматривающему это позже, будет нелегко пересобрать данные.Меньше, что это, хотя, то, что, хотя вы склонны думать о таблице как о контейнере и, следовательно, как об объекте, в действительности они представляют собой экземпляры этого гипотетического контейнера, которые вы пытаетесь собрать и работать лучше, если относитесь к ним как таковым,Создавая таблицу аудита, специфичную для таблицы или подмножества таблиц, которые имеют структурное сходство и сходство данных, вы повышаете производительность своей базы данных и не будете сталкиваться со странным триггером или выбирать связанные проблемы позже.

И вы не можете себе это представить не потому, что вы не очень хороши в том, что делаете, а скорее, структура не способствует ведению журнала базы данных.

Вместо этого я бы порекомендовал вам создать отдельное ведение журнала.таблицы, которые управляют аудитом каждой таблицы, которую вы хотите проверять или регистрировать.На самом деле, некоторые быстрые поиски в Google показывают множество сценариев, уже написанных для выполнения многих из этих задач: Пример одного такого поиска

Вам следует создать эти отдельные таблицы, а затем, если вы хотитеиметь возможность создавать отчеты по нескольким таблицам или даже по всем таблицам одновременно, вы можете создать хранимую процедуру (если вы хотите делать запросы на основе критерия) или представление с включенным оператором SELECT, который ОБЪЕДИНЯЕТ и / или ОБЪЕДИНЯЕТ интересующие вас таблицыв - таким образом, который имеет смысл для типа отчета.Вам все равно придется записывать новые объекты в представление, но даже с вашим первоначальным дизайном таблицы вам придется это учитывать.

...