Предложения по проектированию баз данных MySQL - PullRequest
1 голос
/ 24 декабря 2011

В моей таблице есть следующие поля:

id - user_id - display_time - icon_id - background_id - имя_страницы - template_id - sort_id - время

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

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

Итак ... I может определить фон и значок для каждого готового слайда, но в будущем, если я захочу изменить фон универсальной страницы «Панель инструментов», то сделать это будет нелегко, поскольку она уже есть в базе данных для этого background_id.

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


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

Редактировать:

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

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

Ответы [ 3 ]

3 голосов
/ 24 декабря 2011

Это похоже на ответ, данный @Freeman Latif.Отображение определений таблиц может сделать более понятным, где принадлежат атрибуты сортировки и отображения: эти атрибуты принадлежат таблице, которая связывает пользователей с их выбором слайдов.

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

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

CREATE TABLE Templates (
    template_id      INT PRIMARY KEY,
    icon_id          INT,
    background_id    INT
);

CREATE TABLE Slides (
  slide_id           INT PRIMARY KEY,
  template_id        INT,
  page_name          VARCHAR(20),
  FOREIGN KEY (template_id) REFERENCES SlideTemplates(template_id)
);

CREATE TABLE SlideCustom (
  slide_id           INT PRIMARY KEY,
  icon_id            INT,
  background_id      INT,
  FOREIGN KEY (slide_id) REFERENCES Slides(slide_id)
);

Обратите внимание, что slide_idкак внешний ключ, ссылающийся на Slides, так и первичный ключ SlideCustom.Таким образом, он имеет отношение 1: 1 к этой таблице.

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

CREATE TABLE UserSlides (
  user_id            INT NOT NULL,
  slide_id           INT NOT NULL,
  sort_order         INT NOT NULL,
  display_tenths_sec INT NOT NULL DEFAULT 10,
  PRIMARY KEY (user_id, slide_id),
  FOREIGN KEY (user_id) REFERENCES Users(user_id),
  FOREIGN KEY (slide_id) REFERENCES Slides(slide_id)
);

Теперь вы можете получить каждый слайд для пользователя, а также значок и фон слайда,по умолчанию или по умолчанию:

SELECT u.user_id, u.display_tenth_sec,
  COALESCE(c.icon_id, t.icon_id) AS icon_id,
  COALESCE(c.background_id, t.background_id) AS background_id,
FROM UserSlides u
JOIN Slides s USING (slide_id)
LEFT OUTER JOIN SlideCustom c USING (slide_id)
LEFT OUTER JOIN Templates t USING (template_id)
WHERE u.user_id = 20860
ORDER BY u.sort_order;

Ваш комментарий и дополнительное требование, чтобы пользователь мог использовать данный слайд более одного раза:

Конечно, порядок сортировки уникален дляданный пользователь.Таким образом, вы можете сделать (user_id, sort_order) первичным ключом, а slide_id - просто еще одним неуникальным атрибутом:

CREATE TABLE UserSlides (
  user_id            INT NOT NULL,
  slide_id           INT NOT NULL,
  sort_order         INT NOT NULL,
  display_tenths_sec INT NOT NULL DEFAULT 10,
  PRIMARY KEY (user_id, sort_order),
  FOREIGN KEY (user_id) REFERENCES Users(user_id),
  FOREIGN KEY (slide_id) REFERENCES Slides(slide_id)
);
0 голосов
/ 24 декабря 2011

Прежде всего, «id» немного двусмысленно, поэтому я бы переименовал его в «slide_id».

Для слайдов по умолчанию вы можете добавить столбец «default_slide» (со значением 0 для not и 1, указывающим «default»). Таким образом, ваши слайды по умолчанию могут быть в той же таблице, что и другие слайды, но вы можете легко закодировать свое приложение, чтобы эти слайды не обновлялись. Вы можете сделать то же самое с помощью ограничения проверки или триггера, но я верю в сохранение бизнес-логики в приложении (а не в базе данных).

Кроме того, вы захотите разделить «user_id» из этой таблицы на таблицу мостов, которая выглядит следующим образом:

table: user_slides
user_id int
slide_id int

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

0 голосов
/ 24 декабря 2011

Вы можете разделить эту таблицу на 3 разные таблицы: 1 для слайдов по умолчанию, которые никогда не изменятся (должно быть 12 строк для 12 слайдов по умолчанию), 1 для остальной информации, которая является динамической (время сортировки, время ), 1 для «пользовательских» слайдов, которые сделал пользователь. 3 таблицы должны быть связаны с помощью slide_id. Затем используйте INNER JOIN и UNION для совместного отображения таблиц.

...