这与@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既是外键引用幻灯片,也是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,排序顺序)是主键,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)
);
非常感谢您的帮助。所以有一个问题:模板表有什么意义?看起来幻灯片表格可以与SlideCustom具有相同的确切字段,因为它还需要一个page_name,并且可以从此处定义背景和图标。对? – Drew 2011-12-24 22:33:37
我已编辑回答这些问题。 – 2011-12-24 22:56:26
没问题,我只是好奇!因为幻灯片表格只有12个默认幻灯片,就是这样,对吧?所以如果我改变了默认的背景,它仍然只是一个地方不多。或者我错过了什么? – Drew 2011-12-24 23:16:16