这类似于@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)
);