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 

这样,你只需要定义默认的幻灯片中的行一次,但许多用户可以访问它们。