MySQL数据库设计建议

标签 mysql database database-design relational-database normalization

我的表中有以下字段:

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 而不会弄乱任何东西吗?它说它现在是唯一的,我认为如果我尝试添加另一张相同的幻灯片,这会把事情弄得一团糟。

谢谢!

enter image description here

最佳答案

这与@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/

相关文章:

mysql - 为什么我在 MySQL 中的进程由于某种原因而消失了?

php - 如何在 Codeigniter 中使用 guest 用户愿望 list 到数据库?

mysql - 为什么 active_storage :install's migration (v5. 2.1) 运行时会生成无效的 MySQL 语法?

database - 更改数据库模型 - Sequelize

database - 识别功能依赖

mysql - 如何编写一个查询,其中包含3个表相同的列,并执行其中一个不同的列

mysql - 最不受欢迎的事件 - 获取预订为空或最少的事件列表

sql - 更新和选择

java - JSP 文件输出 If/Else 问题

mysql - 是将表分解并创建具有 3 列 + 外部 ID 的新表,还是只使其成为 n+3 列并且不使用连接更好?