2010-05-17 4 views
2

это часть из моей структуры базы данных:Правильный способ реализовать отношение п-к-м

Table: Item 
Columns: ItemID, Title, Content, Price 

Table: Tag 
Columns: TagID, Title 

Table: ItemTag 
Columns: ItemID, TagID 

Table: Image 
Columns: ImageID, Path, Size, UploadDate 

Table: ItemImage 
Columns: ItemID, ImageID 

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

Вопрос сейчас. Является ли эта структура хорошим способом решения моей проблемы со многими изображениями/тегами для одного элемента?

Спасибо

ответ

4

Да, это то, как это обычно делается. Совершенно нормализованная структура БД для этой цели.

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

Убедитесь, что у вас есть указатели на все внешние ключи и любые другие поля, которые вы обычно фильтруете. Создание составных индексов на ItemTag и ItemImage также может быть хорошей идеей.

+0

Благодарим за помощь – ThreeFingerMark

0

Да, это работает.

В вашей установке:

Пункт имеет много изображений

Item имеет и принадлежит многим Теги

Изображение имеет один Item

Теги имеет и принадлежит многим Пункт

1

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

Вы можете свободно добавлять изображения в таблицу изображений без элемента. Если вы создаете элемент, добавляя изображения к нему, то у вас есть несколько вариантов, как это реализовать:

  1. Создать элемент и связанные с ними объекты изображения в памяти в качестве не сохранялось объектов, пока пользователь редактирования. Элемент и его изображения сохраняются, когда пользователь выполнен.
  2. Попросите пользователя сначала добавить изображения, а затем создать элемент из этого набора изображений.
  3. Создайте новый элемент (с новым идентификатором) и создайте его при создании пользователя. Если пользователь решает отменить, вам придется удалить элемент. Вы также можете удалить изображения, если они были созданы только для этого элемента.

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

0

Вопрос сейчас. Является ли эта структура хорошим способом решить мою проблему с многими изображениями/тегами для одного элемента?

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

Смежные вопросы