這與@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