【问题标题】:MySQL Database Design SuggestionsMySQL 数据库设计建议
【发布时间】:2012-01-27 03:26:32
【问题描述】:

我的表中有以下字段:

id - user_id - display_time - icon_id - background_id - page_name - template_id - sort_id - time

基本上,每个用户都有自己可以创建的幻灯片,这些只是其中的一些设置。这些是针对自定义幻灯片的,但每个用户将有 12 张左右的默认幻灯片是预先制作的。

我的问题是.. 对于所有用户获得的预制幻灯片,我不需要定义所有这些字段。它已经有一个背景和图标,所有这些都无法更改。但是它需要在这个表上,因为用户仍然可以更改排序顺序和时间。

所以...我可以为每张预制幻灯片定义背景和图标,但将来如果我确实想更改通用“仪表板”页面的背景,那么有进行更改没有简单的方法,因为它已经在该 background_id 的数据库中。

对不起,如果这真的令人困惑。有人对如何解决这个问题有任何建议吗?我希望我在这里有正确的想法。


因此,此表适用于自定义幻灯片,但我需要适合所有用户进入此处的通用页面,以便他们可以定义一些重要变量,例如幻灯片将显示多长时间和顺序。有没有更简单的方法来做到这一点?

编辑:

我需要能够按排序顺序添加 1 张以上的同一张幻灯片。因此,如果有人希望幻灯片 1 再次显示,只需更改排序顺序和显示时间。所以每张幻灯片可以有很多不同的“实例”。

我可以取出 slide_id PRIMARY 键而不会弄乱任何东西吗?它说它现在是唯一的,如果我尝试添加另一张相同的幻灯片,我认为这会造成混乱。

谢谢!

【问题讨论】:

    标签: mysql database database-design relational-database normalization


    【解决方案1】:

    这类似于@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)
    );
    

    【讨论】:

    • 非常感谢您的帮助。所以一个问题:模板表的意义何在?并且看起来 Slides 表可以具有与 SlideCustom 相同的字段,因为它还需要一个 page_name 并且可以从那里定义背景和图标。对吗?
    • 没问题,我只是好奇!因为幻灯片表将只有 12 张默认幻灯片,仅此而已,对吧?因此,如果我确实更改了默认背景,它仍然只是一个地方,并不多。还是我错过了什么?
    • 否 -- 幻灯片表将包含所有幻灯片,包括默认和自定义。这样 UserSlides 就可以使用外键引用所有用户的幻灯片,并对它们进行排序。自定义幻灯片在 Slides 中有一行,在 SlideCustom 中有一行。
    • 哦,我现在明白了。再次感谢,如果我有任何其他问题,我会告诉你。
    • 很抱歉,如果自定义幻灯片需要在幻灯片表中也有一行,那么这意味着它必须有一个 template_id。但是图标和背景将在 custom_slides 表中定义,那么我将为 template_id 做什么?模板应该只用于默认幻灯片
    【解决方案2】:

    您可以将此表分成 3 个不同的表:1 个用于永远不会更改的默认幻灯片(这应该有 12 行用于 12 个默认幻灯片),1 个用于动态的其余信息(排序时间、时间), 1 表示用户制作的“自定义”幻灯片。 3 个表应通过 slide_id 连接。然后使用 INNER JOIN 和 UNION 将表格一起显示。

    【讨论】:

    • 但默认幻灯片需要附加一个 user_id,因此它可以确定该特定用户的排序 id 和时间,对吗?所以我有点困惑。
    【解决方案3】:

    首先,“id”有点模糊,所以我将其重命名为“slide_id”。

    对于默认幻灯片,您可以添加“default_slide”列(值为 0 表示非,1 表示“默认”)。这样,您可以将默认幻灯片与其他幻灯片放在同一个表格中,但您可以轻松地编写应用程序以不允许更新这些幻灯片。您可以使用检查约束或触发器来完成同样的事情,但我相信将业务逻辑保留在应用程序(而不是数据库)中。

    此外,您还需要将此表中的“user_id”拆分为如下所示的桥接表:

    table: user_slides
    user_id int
    slide_id int
    

    这样,您只需为默认幻灯片定义一次行,但许多用户都可以访问它们。

    【讨论】:

      猜你喜欢
      • 2011-05-10
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多