Я иду за борт с таблицами MySql? - PullRequest
0 голосов
/ 24 марта 2011

При разработке я добавляю базы данных с каждым крупным дополнением. Моя последняя программа - галерея изображений, я задаю себе все эти вопросы /

Упрощенная версия возможных таблиц

Image (id, name, path, state)
Gallery (id, name, path, state)
Image Gallery Relationship (image id, gallery id)
Image User Relationship (image id, user id)
Image Venue Relationship (image id, venue id)
Image Event Relationship (image id, event id)
Gallery User Relationship (image id, user id)
Gallery Venue Relationship (image id, venue id)
Gallery Event Relationship (image id, event id) 

Я думаю, что одна и та же фотография может принадлежать / сниматься пользователем, назначаться на событие и на место, в галерее из фотографий пользователей, в галерее, связанной с событием, в галерее, связанной с место.

Теперь, если я хочу использовать ту же базу данных для хранения изображения профиля пользователя, я бы создал для этого еще одну таблицу? Должен ли я добавить идентификатор изображения профиля в пользовательскую таблицу? Должен ли я поместить владельца фотографии в таблицу изображений? Но, скорее всего, большая часть картинок не будет загружена пользователями. А как насчет "аватарки" для мероприятия или места? Или обложка галереи? Я создаю много таблиц или недостаточно?

sidenote Обычно при создании столбцов я думаю, что если это обязательный атрибут с одним значением, то поместите его в таблицу. Если он может быть нулевым или связан с несколькими объектами, он, вероятно, должен находиться в другой таблице. Но сейчас у меня 60 столов, и я даже не на полпути к своей программе.

В наши дни мне действительно не хватает наставника, поэтому все советы очень ценятся

Рис связан, это моя текущая база данных my current database

также Если мой вопрос может быть более обобщенным, чтобы помочь будущим людям с подобными вопросами, я не против редактировать

Ответы [ 2 ]

2 голосов
/ 24 марта 2011

Что бы вы ни решили, вы должны создать это и повесить в галерее.

Вы можете упростить это.Посмотрите на это по-другому: рассмотрим одну центральную таблицу вещи , с которой может быть связано изображение, а затем найдите общий язык для этих вещей.Добавьте поле type (gallery, venue, event).Возможно, вы добавите дополнительное поле или два, но в конце это значительно упростит вашу работу и базу данных.Я иду через ту же душу в поисках чего-то, что создаю.

1 голос
/ 24 марта 2011

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

Основное правило: использовать только таблицы объединения (например, Gallery_Image_Relationship (gallery_id, image_id)) когда у вас есть отношения многие ко многим;Я подозреваю, что галерея-изображение является хорошим примером.Галерея содержит много изображений, и изображение может принадлежать многим галереям.Для всего остального, однако, это просто ненужное усложнение.

Для остальных ваших отношений просто поместите внешний ключ в одну из ваших таблиц.Если это один ко многим, таблица очевидна: пользователь может загрузить много изображений, но изображение может быть загружено только одним пользователем?Затем ваша таблица изображений получает столбец uploader_id.

Тем не менее, вот во что это превратится в вашей БД:

users:
  id,
  name,
  profile_image_id, #A user can only have one profile pic (at a time)
  etc.

images:
  id,
  name,
  uploader_id, #It can only be uploded by one person
  etc.

galleries:
  id,
  name,
  cover_image_id,
  etc.

images_galleries: # 'cause images:galleries is many:many
  image_id,
  gallery_id

(я понятия не имею, на каком языке SO это думает.выделены user, by, is и апостроф ...)

Это становится более субъективным, когда вы пытаетесь привязать изображения к объектам и / или событиям.Ожидаете ли вы, что большинство / все ваши изображения относятся к определенному событию?Если это так, то вам, вероятно, понадобится столбец event_id в вашей таблице изображений.То же самое относится и к объектам.

Но если вы ожидаете, что многие изображения не будут иметь какого-либо конкретного события, тогда эти столбцы будут просто пустой тратой пространства БД.Так будет ли галерея обычно привязана к одному событию / месту?Если это так, то именно к этому относятся ваши внешние ключи.

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

Надеюсь, это поможет!

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