Отношения с базой данных - 1: 1, но не всегда? - PullRequest
0 голосов
/ 05 мая 2011

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

Я использую CakePHP и функцию выпекания (однако мне не нужно печь).

Каков наилучший способ достижения следующего:

схема таблицы:

table ranges   
id | name | description

table images
id | range_id | picture

table info (here i am confused)
id | range_id | height | width | colour

По сути, в одном диапазоне может быть много изображений (1: много).Я могу показать это хорошо.

Теперь у каждого диапазона будет запись в таблице info (1: 1) и некоторые атрибуты о диапазоне, такие как высота, цвет, ширина.Но не всегда ...

Допустим, у меня есть диапазон foo.foo имеет пять images, которые имеют одинаковую высоту, ширину и цвет.Однако foo имеет одно изображение другого размера и другого цвета.

Когда атрибуты различаются, мне нужно показать эту информацию с соответствующим изображением, а не с ranges по умолчанию информация.Так что для этого image потребуется собственная запись в таблице info.

Имеет ли это смысл?Или я поступаю совершенно неправильно.

Мое приложение, вкратце: (Если это поможет, подумайте о "диапазоне" как о продукте)

  • Пользователь выбирает диапазон
  • Пользователь просматривает изображения в диапазоне
  • Пользователь может щелкнуть изображение, и в этом диапазоне появляется информация из info.
  • Некоторые изображения имеют разные атрибуты, новсе еще принадлежат к тому же диапазону.
  • Как я могу сделать это различие и сохранить его надлежащим образом?

Пожалуйста, дайте мне знать, если я могу уточнить далее.Спасибо.

1 Ответ

3 голосов
/ 05 мая 2011

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

Существует пара подходов, которые можно использовать для самой простой структуры.part.
рассмотрим следующую структуру

table ranges   
id | name | description | default_info_id

table images
id | range_id | picture | info_id

table info
id | height | width | colour

Когда значение image.info_id имеет значение?Существует два варианта

Заполнить image.info_id значением default_info_id из родительского элемента. Затем пользователь может переопределить его на изображении

Pros

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

Минусы

  • вам нужно решить, что делать при изменении range.default_info_id.это влияет на изображения или это только для будущего

Заполняет images.info_id, только если он отличается от родительского.

Плюсы

  • Если значение parent.default_info_id изменяется, когда значение images.info_id равно нулю, оно также автоматически изменится

Минусы

  • вам нужно решить, что делать при изменении range.default_info_id.Вам нужно теперь обнулить любые images.info_id, которые теперь совпадают с родительскими?

  • Вам нужно взглянуть на таблицу rages, чтобы выяснить, что такое info_id на изображенияхкогда он равен нулю.

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

Информация имеет FK для обеих таблиц, но одна всегда равна нулю

table ranges   
id | name | description 

table images
id | range_id | picture 

table info
id | range_id | image_id | height | width | colour

Информационная таблица вообще отсутствует

table ranges   
id | name | description | default_height | default_width | default_colour

table images
id | range_id | picture | height | width | colour
...