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

Я нахожусь в процессе создания социальной сети. Это имеет несколько объектов как новости, фотография, которая может иметь комментарии. Так как все комментарии имеют те же столбцы и ведут себя тот же путь, и единственной разницей является их тип — новости, или фотография или что-то еще, чтобы быть добавленной в будущем — я решил составить одну таблицу для всех комментариев с названным столбцом type. Это работало отлично, пока я не решил добавить внешние ключи к своей схеме базы данных.

comment таблица имеет столбец parent, который относится к id из news или photo таблица, в зависимости от столбца type.

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

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

Я уверен, что не могу создать такой внешний ключ; что-то в моем проектировании баз данных должно быть изменено. Я решил составить одну таблицу для комментариев, чтобы быть готов добавить новые типы комментария для новых объектов в будущем — видео, музыки, статьи, и т.д. — и не побежал на ад обслуживания, когда я хочу добавить один новый столбец для всех комментариев.

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

Возможно, я должен составить своего рода таблицу ссылки, которая связывается comment таблица с таблицами других объектов? Но возможно это решение еще более сложно, чем составление отдельной таблицы для каждого типа комментария?

Возможно, у меня должно быть несколько столбцов в comment таблица, как newsId, photoId, к которому я могу добавить внешний ключ?

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

7
задан Elnur Abdurrakhimov 19 February 2010 в 06:33
поделиться

1 ответ

Я бы пошел с «не идиоматическим», хотя я видел примеры таких стилей свободного интерфейса в коде C++.

Это может быть связано с тем, что существует ряд способов решения одной и той же основной проблемы. Обычно проблема, решаемая здесь, заключается в названных аргументах (или, скорее, в их отсутствии). Возможно, более C++ -образным решением этой проблемы может быть Библиотека параметров Boost .

-121--2980835-

Это, похоже, правильное поведение.

http://bclary.com/2004/11/07/#a-15.3.4.4

Function.prototype.call - вызываемая функция передается ToObject (thisArg) в качестве этого значения.

ToObject «преобразует свой аргумент в значение типа Object согласно следующему»:

Последовательность - создает новый объект Последовательности, свойство [[value] которого набора значению последовательности.

-121--3348318-

Я думаю, что ваша проблема в том, что у вас есть несколько сущностей - новости, фотографии. Но все это только типы (скажем) предметов. Как и комментарии, предметы, вероятно, будут иметь некоторые общие атрибуты, а также некоторые отдельные атрибуты. Одним из этих атрибутов будет возможность комментировать.

В этом подходе имеется таблица CommentureItems (1) с общими атрибутами. Затем имеются подтаблицы NewsItems , Фотопредметов и т.д. Довольно легко настроить ключи для этих таблиц для обеспечения требуемого отношения «один к одному». Очевидно, что Comments имеет внешний ключ, который ссылается на CommentureItems .

(1) На самом деле я бы, вероятно, застрелился, а не пустил в свою схему таблицу, называемую чем-то столь же ужасным, как CommentureItems , но это просто ради примера.

5
ответ дан 7 December 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: