Таблица изображений для обслуживания двух сторонних таблиц? - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть image table,

image_id
image_title
image_description
image_source

, и я хочу, чтобы image table ассоциировался с page table и иногда с comment table

таблица страниц,

page_id
...
...

таблица комментариев,

comment_id
...
...

Должен ли я вставить внешний ключ page_id и comment_id в image таблицу?

image_id
image_title
image_description
image_source
page_id
comment_id

Или я должен создать таблицу map для каждой цели?

a map таблицу для изображения и страницы

image_id
page_id

и другую map таблица изображений и комментариев

image_id
comment_id

Что такое наилучшая практика для такого сценария?

Не замедлится ли image таблица если я использую map идею, когда строка таблицы image увеличивается (это еще одна главная проблема)?

В настоящее время я делаю это,

image page table,

image_id
image_title
image_description
image_source
page_id

image comment table,

image_id
image_title
image_description
image_source
comment_id

, но это не выглядит хорошо, так как я повторяю столбцы, и оно не выглядит динамическим ...

Есть мысли?

РЕДАКТИРОВАТЬ:

ИногдаИзображение связано со страницей, а иногда и с комментарием.Изображение для загрузки иногда предназначено для самой статьи, а иногда для комментария под статьей.

image_id  image_title  page_id  comment_id
1         a            1        NULL
2         b            NULL     1
3         c            1        NULL
4         d            1        NULL

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

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

Итак, одна таблица Image и две таблицы отображения выглядят намного лучше. Если позже вы захотите сохранить больше (и другую) информацию об этих сопоставлениях - например, вы можете добавить отметку времени last_changed и ограничение размера для PageImage (макс. 100 КБ на изображение) и ограничение числа для CommentImage ( макс. 3 на комментарий) - вам не нужно менять общий дизайн, только эти 2 таблицы соответствия.

Однако вы можете создать несколько таблиц сопоставления, скажем, одну для UserImage, другую для MessageImage и еще одну для EmailImage, причем все они имеют одинаковую (или почти идентичную) структуру - и это снова приводит к дублированию кода.

Чтобы устранить такое дублирование, вы можете использовать шаблон супертип / подтип. Создайте супертип Entity, с Page, Comment, User, Message, Email в качестве подтипов (каждый из этих дочерних объектов будет иметь первичный ключ, который также является внешним ключом для супертипа Entity).

Тогда ваши сопоставления могут быть легко объединены в одну таблицу EntityImage (с FK до Image и Entity).

1 голос
/ 22 февраля 2012

Ваш Картинка стол в порядке. Вы должны создать таблицу Comment и таблицу Page и сохранить в этих таблицах ImageId .

РЕДАКТИРОВАТЬ: (Не прочитал все комментарии)

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

...