Для нескольких таблиц требуется одно-много отношений

У меня есть база данных SQL с несколькими таблицами: A, B, C, D. Объекты в этих таблицах - это совершенно разные вещи, с разными столбцами и разными типами отношений между ними.
Однако все они имеют одну небольшую вещь: необходимость в системе комментариев, которая в этом случае будет иметь идентичную структуру: author_id, date, content и т.д.

Интересно, какая стратегия лучше всего подходит для этой схемы, чтобы таблицы A,.. D использовали систему комментариев. На классическом веб-сайте "блог" я бы использовал отношение "один ко многим" с post_id внутри таблицы "комментариев".

Здесь, похоже, мне нужны таблицы A_comments, B_comments и т.д. Для решения этой проблемы, что выглядит немного странно.

Есть ли способ лучше?

Ответы

Ответ 1

Создайте таблицу comment с основным ключом comment_id и различными атрибутами комментария.

Кроме того, создайте A_comment таким образом:

CREATE TABLE A_comment (
    comment_id PRIMARY KEY REFERENCES comment(comment_id),
    A_id REFERENCES A(A_id)
)

Аналогично для B, C и D. Это обеспечивает ссылочную целостность между comment и всеми другими таблицами, которые вы не можете сделать, если вы храните идентификаторы до A, B, C и D непосредственно в comment.

Объявление A_comment.comment_id в качестве первичного ключа гарантирует, что комментарий может принадлежать только одной записи в A. Это не препятствует тому, чтобы комментарий принадлежал записи в и записи в B, но там только так много вас можно добиться с помощью внешних ключей; для этого потребуются ограничения на уровне базы данных, о которых ни одна база данных, о которой я знаю, не поддерживает.

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

Ответ 2

У меня была аналогичная "проблема" с комментариями для более разных типов объектов (например, статей и магазинов в моем случае, у каждого типа есть своя таблица).

Что я сделал: в моей таблице комментариев у меня есть два столбца, которые управляют связыванием:

  • object_type (тип ENUM), который определяет объект/таблицу, к которой мы привязываемся, и
  • object_id (беззнаковый целочисленный тип, который соответствует первичному ключу ваших других таблиц (или самому большому из них)), которые указывают на точную строку в конкретной таблице.

Структура столбца: id, object_type, object_id, author_id, date, content и т.д.

Здесь важно иметь индекс для обоих столбцов (object_type, object_id), чтобы быстро индексировать.

Ответ 3

Я предполагаю, что вы говорите о одной таблице комментариев с внешним ключом, чтобы "точно один из" A "," B "," C "или" D ".

Тот факт, что SQL не может справиться с этим, является одной из его основных недостатков. Вопрос задается снова и снова.

См., например.

Каков наилучший способ принудительного применения отношения подмножества с ограничениями целостности

Ваше ограничение - это "внешний ключ" из вашей таблицы "одиночных комментариев" в представлении, который является объединением идентификаторов в A, B, C и D. SQL поддерживает только внешние ключи в базовые таблицы.

Обратите внимание, что SQL как язык поддерживает вашу ситуацию в форме CREATE ASSERTION. Однако я не знаю, какие продукты SQL поддерживают этот оператор.

ИЗМЕНИТЬ Вы также должны иметь в виду, что с помощью таблицы "одиночных" комментариев вам может потребоваться принудительная дизъюнкция между ключами в A, B, C и D, иначе может произойти некоторое время, когда комментарий автоматически получает "общий" между сущностью вхождения из разных таблиц, что может быть нежелательно.

Ответ 4

У вас может быть одна таблица комментариев и внутри этой таблицы есть столбец, который содержит значение, отличающее ту, к которой принадлежит комментарий, - то есть 1 в этом столбце означает комментарий для таблицы A, 2 для таблицы B и т.д. на. Если вы не хотите иметь "магические числа" в таблице комментариев, у вас может быть другая таблица с двумя столбцами: одна с номером и другая подробная информация, какая таблица представляет собой номер.

Ответ 5

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