SQL: избегайте циклических зависимостей - PullRequest
5 голосов
/ 21 января 2012

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

У меня есть таблица пользователей и таблица изображений

Каждая картинка имеетuserId (пользователь, который его вставил) У каждого пользователя есть изображение профиля

Я мог бы просто создать таблицу ProfilePictures, но это могло бы вызвать проблемы в некоторых других местах (например, комментарии к изображениям).

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

Итак, можно ли использовать циклическую зависимостьВот?или если нет, как бы вы этого избежать?

Ответы [ 3 ]

8 голосов
/ 21 января 2012

Без циклических ссылок между таблицами:

User 
------
userid NOT NULL
PRIMARY KEY (userid)

Picture
---------
pictureid NOT NULL
userid NOT NULL
PRIMARY KEY (pictureid)
UNIQUE KEY (userid, pictureid)
FOREIGN KEY (userid)
  REFERENCES User(userid)

ProfilePicture
---------
userid NOT NULL
pictureid NOT NULL
PRIMARY KEY (userid)
FOREIGN KEY (userid, pictureid)        --- if a user is allowed to use only a
  REFERENCES Picture(userid, picture)  --- picture of his own in his profile

FOREIGN KEY (pictureid)                --- if a user is allowed to use any 
  REFERENCES Picture(picture)          --- picture in his profile

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

User 
------
userid NOT NULL
profilepictureid NULL                  --- Note the NULL here
PRIMARY KEY (userid)
FOREIGN KEY (userid, profilepictureid)   --- if a user is allowed to use only a
  REFERENCES Picture(userid, pictureid)  --- picture of his own in his profile

FOREIGN KEY (profilepictureid)           --- if a user is allowed to use any 
  REFERENCES Picture(pictureid)          --- picture in his profile

Picture
---------
pictureid NOT NULL
userid NOT NULL
PRIMARY KEY (pictureid)
UNIQUE KEY (userid, pictureid)
FOREIGN KEY (userid)
  REFERENCES User(userid)

profilepictureid можно установить на NOT NULL, но тогда вам придется иметь дело с проблемой курицы и яйца, когда вы хотите вставить в две таблицы.Это может быть решено - в некоторых СУБД, таких как PostgreSQL и Oracle - с использованием отложенных ограничений.

2 голосов
/ 21 января 2012

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

0 голосов
/ 21 января 2012

У пользователей есть UserID и ProfilePictureID

Изображения

Имеет PictureID, изображение и ID пользователя

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

Даже не рассматривайте этот циркуляр как таковой.

...