我的表格中有以下字段:
id - user_id - display_time - icon_id - background_id - page_name - template_id - sort_id - time
基本上,每个用户都有自己可以创建的幻灯片,这些只是其中的一些设置。这些是用于自定义幻灯片,但每个用户将有12个左右预制的默认幻灯片。
我的问题是..对于所有用户都可以获得的预制幻灯片,我不需要定义所有这些字段。它将具有背景和图标以及所有这些,无法更改。但是它需要在此表上,因为用户仍然可以更改排序顺序和时间。
所以......我可以定义每个预制幻灯片的背景和图标,但是将来如果我确实想要更改通用“仪表板”页面的背景,那么没有简单的方法来进行更改,因为它已经存在于background_id的数据库中。
很抱歉,如果这真的令人困惑。有没有人对如何处理这个有任何建议?我希望我在这里有正确的想法。
因此,此表适用于自定义幻灯片,但我需要适应所有用户在此处获得的通用页面,以便他们可以定义一些重要的变量,例如幻灯片显示的时间和顺序。有更简单的方法吗?
修改
我需要能够在排序顺序中添加多个相同的幻灯片。因此,如果有人希望幻灯片1再次显示,只需更改排序顺序和显示时间。因此,每张幻灯片可以有许多不同的“实例”。
我可以取出slide_id PRIMARY键而不会弄乱任何东西吗?它说它现在是独一无二的,我认为如果我试图添加另一张相同的幻灯片,这会让这个陷入困境。
谢谢!
答案 0 :(得分:3)
这与@Freeman Latif给出的答案类似。显示表定义可以更清楚地说明排序和显示属性所属的位置:这些属性属于将用户与其幻灯片选项相关联的表。
我正在猜测你希望这些属性是多么灵活。如果你对属性的意图不同于我的设计支持,那么我很抱歉。
例如,我正在添加一个模板表,以便您可以定义默认图标&背景,然后将该设计作为幻灯片的默认设置。然后,如果您更改了默认背景,则只需在Templates表中的一行中更改它,而不是在Slides表中更改许多行。这是规范化的好处的一部分:像背景这样的事实只记录在一个地方,所以你不会在一些行而不是其他行上意外地改变它。
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,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)
);
答案 1 :(得分:0)
您可以将此表分为3个不同的表:1表示永远不会更改的默认幻灯片(12个默认幻灯片应该有12行),其余1个表是动态的(排序时间,时间) ),1表示用户制作的“自定义”幻灯片。应该通过slide_id连接3个表。然后使用INNER JOIN和UNION一起显示表。
答案 2 :(得分:0)
首先,“id”有点含糊不清,所以我将其重命名为“slide_id”。
对于默认幻灯片,您可以添加“default_slide”列(值为0表示not,1表示“default”)。这样,您可以将默认幻灯片放在与其他幻灯片相同的表格中,但您可以轻松编写应用程序代码,以便不允许更新这些幻灯片。您可以使用检查约束或触发器完成相同的操作,但我相信将业务逻辑保留在应用程序(而不是数据库)中。
此外,您还希望将此表中的“user_id”拆分为如下所示的桥接表:
table: user_slides
user_id int
slide_id int
这样,您只需要为默认幻灯片定义一次行,但许多用户可以访问它们。