Как обрабатывать таблицы с несколькими родителями - PullRequest
1 голос
/ 23 июля 2011

У меня проблемы с моделированием конкретной структуры базы данных, над которой я работаю. Короче говоря, учитывая следующее:

  • Веб-страница может иметь одну или несколько тем
  • Тема состоит из одного или нескольких комментариев
  • На комментарии могут быть поданы одна или несколько жалоб
  • Жалобы также могут быть поданы против потока в целом
  • Жалобы также могут подаваться на страницу

Я не могу понять, как смоделировать это на уровне БД. Первые три легко:

webpage
----------
id
name

thread
---------
id
page_id
name

comment
--------
id
thread_id
name

Но если бы я хотел единую таблицу жалоб, как бы это смоделировать? Я не думаю, что вы хотели бы сделать:

complaint
----------
id
page_id
thread_id
comment_id

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

Заранее спасибо, - Энтони

Ответы [ 3 ]

1 голос
/ 23 июля 2011

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

Итак, у меня были бы следующие таблицы ...

  • жалоба
  • compliant_comment_link
  • complaint_thread_link
  • complaint_page_link

Это немного другой вариант решения Валида. Как и во всех подобных вещах, есть много способов решить эту проблему:)

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

0 голосов
/ 23 июля 2011

Другой подход заключается в создании новой таблицы entity, которая имеет отношение супертип / подтип с 3 таблицами (веб-страница, ветка, комментарий):

entity
----------
id (PK)

webpage
----------
id (PK)
name
FOREIGN KEY id REFERENCES entity(id)

thread
---------
id (PK)
page_id
name
FOREIGN KEY id REFERENCES entity(id)

comment
--------
id (PK)
thread_id
name
FOREIGN KEY id REFERENCES entity(id)

complaint
----------
id (PK)
entity_id 
FOREIGN KEY entity_id REFERENCES entity(id)

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

0 голосов
/ 23 июля 2011

Одно из решений моей головы - иметь стол:

ObjectType

-------------------
|  id  |   name   |
-------------------
|   1  | Webpage  |
|   2  | Thread   |
|   3  | Comment  |
-------------------

Тогда ваша таблица жалоб может быть следующей:

----------------------------------------
|  id  |   object_type_id   | objectid |
----------------------------------------
|   1  |         1          |    1     |
|   2  |         1          |    2     |
|   3  |         2          |    1     |
---------------------------------------|

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

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