Разработка реляционной базы данных для сайта фотографии - PullRequest
2 голосов
/ 18 августа 2011

Я создаю базу данных для веб-сайта, посвященного фотографии, и хочу, чтобы она позволяла использовать три основные вещи -

Разрешить владельцу / администратору создавать учетные записи клиентов и учетные данные,
Указание, какие фотографии следует поместить в три разные галереи портфолио на сайте, и
Отображение уникальных фотографий клиента (и только их фотографий!) Для них при входе в систему.

Это мой первый дизайн базы данных за все время - основываясь на ответах ниже, я добавил этот акцент;) и отредактировал дизайн, как показано ниже.

ИЗОБРАЖЕНИЯ
image_id,
имя файла,
описание,
client_id,
date_uploaded,

ПОЛЬЗОВАТЕЛИ / КЛИЕНТЫ
client_id,
имя клиента
имя пользователя,
пароль,

ПОРТФОЛИО
port_id,
portfolio_name,

PORTFOLIO_IMAGES
id,
image_id,
port_id,

Правильно ли я считаю, что окончательный идентификатор в PORTFOLIO_IMAGES позволит мне отображать одно изображение в нескольких галереях?
Спасибо

Ответы [ 4 ]

2 голосов
/ 18 августа 2011

Поскольку это ваш первый DB-Design и, как вы, возможно, упомянули в комментариях, здесь чего-то не хватает: ER-Diagram .Это помогает понять, что происходит.

ER-диаграмма

enter image description here

Синонимы : пользователь = учетная запись, изображение = фотография, галерея= Портфолио
Известные роли : «Администратор», «Клиент»
Примеры прав : «Создать учетную запись», «Удалить учетную запись», «Просмотреть изображения», «Добавить галерею »,« Удалить галерею »,« Загрузить изображение »,« Удалить изображение », ...

Дизайн таблицы

Пользователь

  • идентификатор
  • имя
  • пароль

изображение

  • идентификатор
  • user_id
  • имя файла
  • описание
  • upload_date

Image_Gallery

  • image_id
  • gallery_id

Галерея

  • id
  • имя

User_Role

  • user_id
  • role_id

User_Right

user_id right_id

Роль

  • id
  • имя

Role_Right

  • role_id
  • right_id

Right

  • id
  • name

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

1 голос
/ 18 августа 2011
  1. В таблицах images и users вы будете ссылаться на идентификатор клиента, а не на имя.
  2. Я бы создал отдельную таблицу для галерей, поскольку клиенты, как правило, имеютновые пожелания каждые три месяца.Так что, возможно, вам нужно добавить больше галерей.
    • таблица "галереи"
      • id
      • имя
    • таблица "image_is_in_gallery"
      • image_id
      • gallery_id
      • PRIMARY (image_id, gallery_id)
1 голос
/ 18 августа 2011

Возможно, вы захотите рассмотреть вопрос о нормализации.

Если предположить, что имена пользователей уникальны - два человека не могут иметь одно и то же имя пользователя, заходите - тогда вы можете исключить "id" из таблицы Users, чтобы предотвратить обновление / вставку / удаление аномалий (выполнение этого почти наверняка положить пользователей в BCNF, и, вероятно, DKNF - это хорошо).

Клиенты в порядке. В чем разница между Клиентами и Пользователями? Действительно ... похоже на меня.

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

EDIT:

На основе нового дизайна у меня есть следующие предложения:

Изменение клиентов / пользователей на три таблицы:

  ClientNames
  - ClientID (PK)
  - ClientName

  ClientUsernames
  - ClientID (PK)
  - Username

  UsernamePasswords
  - Username (PK)
  - Password

Это безопасно и говорит о том, что один Клиент / Пользователь имеет одно имя, один Клиент / Пользователь имеет одно Имя пользователя и одно Имя пользователя имеет один Пароль. Я не вижу другого хорошего разложения (в том смысле, что оно будет в плотной нормальной форме).

Вы можете исключить одну из этих таблиц, исключив синтетический ключ "ClientID", если хотите. У этого есть недостатки, и это может быть невозможно (некоторые люди имеют одно и то же имя!).

Проблема в том, что ClientID, ClientName и UserName, скорее всего, определяют друг друга таким образом, что их нельзя поместить в одну таблицу.

0 голосов
/ 18 августа 2011
  1. использовать идентификатор клиента вместо client_name в таблице изображений и пользователей
  2. Добавить еще одну таблицу, портфолио, по крайней мере, с именами и столбцами идентификаторов
  3. Добавьте еще одну таблицу, portfolio_images с двумя столбцами, image_id и portfolio_id. Это позволит функцию, упомянутую @Alex в комментариях

ответ на редактирование
Вы можете сделать одно изображение в нескольких портфелях, запросив PORTFOLIO_IMAGES и при необходимости присоединившись к изображениям или портфелям. Например, если вы хотите отобразить свадебное портфолио (псевдо-код)

SELECT filename,... 
FROM images img
INNER JOIN portfolio_images pimg on img.image_id = portfolio_images.image_id
WHERE pimg.portfolio_id = <whatever the id is for wedding portfolio>
...