我的表中有以下字段:
id - user_id - display_time - icon_id - background_id - page_name - template_id - sort_id - time
基本上,每个用户都有自己可以创建的幻灯片,这些只是幻灯片中的一些设置。这些用于自定义幻灯片,但每个用户将有 12 张左右的预制默认幻灯片。
我的问题是.. 对于所有用户获得的预制幻灯片,我不需要定义所有这些字段。它已经有了背景和图标,所有这些都无法更改。但是它需要在此表中,因为用户仍然可以更改排序顺序和时间。
所以...我可以为每张预制幻灯片定义背景和图标,但将来如果我确实想更改通用“仪表板”页面的背景,那么有没有简单的方法来进行更改,因为它已经在该 background_id 的数据库中。
抱歉,如果这真的令人困惑。有人对如何处理这个问题有什么建议吗?我希望我在这里有正确的想法。
因此,此表适用于自定义幻灯片,但我需要适合所有用户进入此处的通用页面,以便他们可以定义一些重要的变量,例如幻灯片将显示多长时间和顺序。有更简单的方法吗?
编辑:
我需要能够按排序顺序添加超过 1 张相同的幻灯片。因此,如果有人希望幻灯片 1 再次出现,只需更改排序顺序和显示时间即可。因此,他们可以为每张幻灯片设置许多不同的“实例”。
我可以取出 slide_id PRIMARY key 而不会弄乱任何东西吗?它说它现在是唯一的,我认为如果我尝试添加另一张相同的幻灯片,这会把事情弄得一团糟。
谢谢!
最佳答案
这与@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)
);
关于MySQL数据库设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8621644/