Это похоже на ответ, данный @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)
);