Как связать одну таблицу со многими разными? - PullRequest
3 голосов
/ 18 ноября 2008

У меня есть список таблиц, т. Е. Студент, преподаватель, персонал, кафедра. и так далее, и в каждой из этих таблиц есть свои комментарии. Теперь одна запись в таблице может иметь один или несколько комментариев, показывающих, что это отношение один ко многим из любой таблицы в таблицу комментариев. Я не знаю, как лучше связать таблицу комментариев с каждым из них. Если я добавлю внешний ключ из таблицы комментариев в каждую из этих таблиц, это будет как 40-50 полей в зависимости от нет. столов. Во-вторых, если я добавлю внешний ключ из каждой из этих таблиц в таблицу замечаний, это будет похоже на повторение всей строки только для второго внешнего ключа примечаний? Точно так же, если я буду использовать только одно поле в каждой таблице в качестве комментариев, я буду фактически хранить строки только в одном текстовом поле. Любые предложения о том, как добиться эффективного решения?

Ответы [ 7 ]

6 голосов
/ 18 ноября 2008

Предположим, что все ваши таблицы (студент, преподаватель, персонал, отдел) имеют первичный ключ int с именем Id.

Для вашей таблицы комментариев вы можете создать таблицу.

Id int
CommentType enum (student, teacher, staff, dept)
LinkId int
Comment

Строка в комментариях может выглядеть следующим образом

1,'Student',347,'text'
2 голосов
/ 18 ноября 2008

Поскольку это отношение «многие ко многим», вы, возможно, захотите взглянуть на использование ассоциативной таблицы.

Используя ваш пример, это может выглядеть примерно так:

Ваши таблицы, которые могут иметь комментариев:

+----------+------------+
| student  | student_id |
+----------+------------+
| Steve    |         12 |
| Larry    |         57 |
| Sunshine |         88 |
+----------+------------+

+--------+---------+
| dept   | dept_id |
+--------+---------+
| Math   |       2 |
| P.E.   |       5 |
| Drama  |      12 |
+--------+---------+

Тогда вам нужно отслеживать реальные комментарии:

+-----------------------+------------+
| comment               | comment_id |
+-----------------------+------------+
| I love Math!          |          3 |
| Larry is my hero...   |          5 |
| Sunshine <3 Me!       |          6 |
+-----------------------+------------+

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

+------------+------------+
| student_id | comment_id |
+------------+------------+
|         57 |          5 |
|         57 |          6 |
+------------+------------+

+---------+------------+
| dept_id | comment_id |
+---------+------------+
|       2 |          3 |
+---------+------------+

Это одновременно эффектно и элегантно. Дайте ему шанс!

(И, чтобы спасти вас, возможно, еще один вопрос)

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

+-----------+------------+---------+
| entity_id | comment_id | entity  |
+-----------+------------+---------+
|        57 |          5 | student |
|        57 |          6 | student |
|         2 |          3 | dept    |
+-----------+------------+---------+

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

2 голосов
/ 18 ноября 2008

Вы можете использовать промежуточные таблицы «многие ко многим». Каждая базовая таблица (студент, профессор и т. Д.) Будет иметь альтернативное эго, хранящее один внешний ключ в базовой таблице (например, student_id) и один внешний ключ в таблице комментариев. Вы практически удваиваете количество таблиц, но вам не нужно изменять существующие таблицы, и вы получаете полную гибкость.

1 голос
/ 18 ноября 2008

Ваша таблица комментариев может выглядеть следующим образом:

CommentID (int) - Primary Key
TableName (varchar(250)) - Table the comment is related to
RecordID (int) - the ID of the record in the table referred to
Comment (text) - the actual comment

Конечно, вы можете добавить дополнительные поля, такие как отметка времени, которая позволит вам выбирать комментарии в порядке их ввода.

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

1 голос
/ 18 ноября 2008

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

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

затем в таблице сопоставления у вас есть comment_id и ???? _ id с ограничением внешнего ключа для таблицы оценки.

0 голосов
/ 27 ноября 2008

Мои 50 центов: решение Zoredache определенно хорошо, но я не рекомендую использовать перечисления; они не очень умны в mysql: если вы указываете неизвестное значение, ошибка представляется пустой строкой - даже если указано какое-то значение по умолчанию. Кроме того, это безумно долго, чтобы изменить, если вы хотите изменить или добавить новый тип. unsigned tinyint должно быть достаточно для большинства ваших потребностей ...

0 голосов
/ 18 ноября 2008

- это студент, преподаватель или сотрудник, а не просто человек ..

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

трудно увидеть без более глубокой схемы

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