1

我在我的表中的以下字段:MySQL數據庫設計建議

ID - USER_ID - DISPLAY_TIME - icon_id - background_id - PAGE_NAME - template_id - sort_id - 時間

基本上,每個用戶都有自己的幻燈片,他們可以創建,這些只是其中的一些設置。這些用於定製幻燈片,但每個用戶將有12個左右的預製幻燈片。

我的問題是,對於所有用戶獲得的預製幻燈片,我不需要定義所有這些字段。它已經有一個背景和圖標,所有這些都是無法改變的。但是它需要放在這張桌子上,因爲用戶仍然可以更改排序順序和時間。

因此...我可能定義每個預製幻燈片的背景和圖標,但在將來如果我確實想更改通用「儀表板」頁面的背景,那麼沒有簡單的方法進行更改,因爲它已經在該background_id的數據庫中。

對不起,如果這真的讓人困惑。有沒有人有任何建議如何解決這個問題?我希望我在這裏有正確的想法。


所以這個表是好的自定義幻燈片,但我需要適應所有用戶在這裏得到普遍的網頁,使他們能夠定義一些重要的變量,如幻燈片多久顯示和順序。有沒有更簡單的方法來做到這一點?

編輯:

我需要在排序順序添加相同的滑動超過1的能力。因此,如果有人希望幻燈片1再次出現,只需更改排序順序並顯示時間。所以他們可以有每個幻燈片的許多不同的「實例」。

我可以取出slide_id PRIMARY鍵而不會弄亂任何東西嗎?它說它現在是獨特的,如果我嘗試添加另一張幻燈片,我認爲這會讓這個混亂。

謝謝!

enter image description here

回答

3

這與@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) 
); 
+0

非常感謝您的幫助。所以有一個問題:模板表有什麼意義?看起來幻燈片表格可以與SlideCustom具有相同的確切字段,因爲它還需要一個page_name,並且可以從此處定義背景和圖標。對? – Drew 2011-12-24 22:33:37

+0

我已編輯回答這些問題。 – 2011-12-24 22:56:26

+0

沒問題,我只是好奇!因爲幻燈片表格只有12個默認幻燈片,就是這樣,對吧?所以如果我改變了默認的背景,它仍然只是一個地方不多。或者我錯過了什麼? – Drew 2011-12-24 23:16:16

0

您可以將此表分爲3個不同的表:1默認幻燈片永遠不變(這應該有一個12張默認幻燈片12行),1對作爲信息的其餘部分動態(排序時間,時間),1爲用戶製作的「自定義」幻燈片。這3個表格應該通過slide_id連接。然後使用INNER JOIN和UNION將表格一起顯示。

+0

但默認幻燈片需要連接到它爲user_id,所以它能夠確定排序ID和時間對於特定的用戶,對嗎?所以我有點困惑。 – Drew 2011-12-24 01:35:19

0

首先,「ID」有點模棱兩可,所以我會將其重命名爲「slide_id」。

對於默認幻燈片,您可以添加一個「default_slide」列(其值爲0而非1表示「默認」)。這樣,您可以將默認幻燈片放在與其他幻燈片相同的表格中,但是您可以輕鬆編寫應用程序的代碼,以便不允許更新這些幻燈片。你可以用檢查約束或觸發器來完成同樣的事情,但我相信在應用程序中保留業務邏輯(而不是數據庫)。

而且,你會想從該表中「user_ID的」出分成橋接表看起來像這樣:

table: user_slides 
user_id int 
slide_id int 

這樣,你只需要定義默認的幻燈片中的行一次,但許多用戶可以訪問它們。