Структура базы данных: как лучше проектировать для этой проблемы? - PullRequest
0 голосов
/ 18 марта 2012

У меня есть пользователи, которые имеют несколько объектов и могут загружать изображения для этих объектов.У каждого объекта есть несколько предметов.Фотографии, загружаемые пользователем, могут быть назначены этим элементам.Дело в том, что один объект может иметь один конкретный предмет более одного раза.

Например: объекты - это автомобили, а предметы - это сиденья, окна, двери и т. Д. Автомобиль может иметь 5 мест, но все места.это тот же элемент.Однако описание изображения должно быть «место 1», «место 2» и т. Д., И пользователь также может загрузить несколько изображений для места 2.

До сих пор у меня естьследующие таблицы:

объекты : идентификатор, имя

элементы : идентификатор, имя

assign_items: id, object_id, item_id, количество

images : id, object_id, item_id

Как лучше всего решить эту проблему?

Причина, по которой я использую количество, заключается в том, что если тип товара меняется, то, скорее всего, из всех предметов.Например, 4 места могут стать 4 колесами и т. Д. Итак, если бы для каждого назначенного элемента был ряд, скажем, seat1, seat2, seat3 и т. Д., То это было бы сложнее изменить, нет?

Ответы [ 2 ]

1 голос
/ 18 марта 2012

Посмотрите на эту модель:

enter image description here

Позволяет:

  • Соединить несколько элементов с несколькими объектами (благодаря таблице OBJECT_ITEM).
  • Подключите один и тот же элемент несколько раз к одному и тому же объекту (благодаря полю OBJECT_ITEM.POSITION).
  • Подключите несколько изображений к соединению объект-элемент (благодаря таблице OBJECT_ITEM_IMAGE).Итак, мы подключаемся к соединению , а не напрямую к элементу.
  • Назовите изображение, относящееся к соединению объект-элемент (благодаря полю OBJECT_ITEM_IMAGE.IMAGE_NAME), а не просто конкретноек изображению.
  • Убедитесь, что имя изображения уникально для каждого соединения объекта (благодаря уникальному ограничению "U1").

ПРИМЕЧАНИЕ. Эта модель может быть упрощена в случае ОБЪЕКТА:ПУНКТ отношения 1: N вместо M: N, но ваша собственная попытка модели, кажется, предполагает, что это M: N.

ПРИМЕЧАНИЕ. Чтобы подключить изображение непосредственно к OBJECT (вместо OBJECT_ITEM), вы 'Мне нужна дополнительная таблица ссылок (OBJECT_IMAGE) в «между» OBJECT и IMAGE.


Пример данных:

OBJECT:
    Car

ITEM:
    Seat

OBJECT_ITEM:
    Car-Seat-1
    Car-Seat-2
    Car-Seat-3
    Car-Seat-4
    Car-Seat-5

OBJECT_ITEM_IMAGE:
    Car-Seat-1-Image1 "Seat1 Image"
    Car-Seat-2-Image1 "Seat2 Image"
    Car-Seat-2-Image2 "Seat2 Alternate Image"
    Car-Seat-3-Image1 "Seat3 Image"
    Car-Seat-4-Image1 "Seat4 Image"
    Car-Seat-5-Image1 "Seat5 Image"

IMAGE:
    Image1
    Image2
1 голос
/ 18 марта 2012

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

Вот что я предлагаю:

ОБЪЕКТ: идентификатор, имя

ПУНКТ: идентификатор, имя, количество, идентификатор_объекта

ИЗОБРАЖЕНИЕ: идентификатор, имя (ноль), идентификатор_объекта (ноль), идентификатор_объекта (ноль)

Если ваша СУБД поддерживает ограничения, установите ограничение IMAGE для принудительного применения одного или другого из object_id или item_id (но не обоих). Это позволяет определить изображение как для элемента, так и для объекта в целом.

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

...