【问题标题】:mysql database normalization questionmysql数据库规范化问题
【发布时间】:2010-04-09 23:26:22
【问题描述】:

这是我的 3 张桌子:

表1——存储用户信息,有唯一数据

表 2 -- 存储地点类别,例如多伦多、纽约、伦敦等,因此这也是独一无二的

表 3 -- 有重复的信息。它存储用户去过的所有地方。

这 3 个表由这些 id 链接或连接:

表 1 有一个“table1_id”

表 2 有一个“table2_id”和“place_name”

表 3 有一个“table3_id”、“table1_id”、“place_name”

我有一个界面,管理员可以看到所有用户。用户旁边是“编辑”按钮。单击该编辑按钮可让您在具有多个“地点”下拉框的表单字段中编辑特定用户。

如果管理员编辑用户并为用户添加 1 个“地点”,我会使用 php 插入该信息。如果管理员决定取消选择 1 个“地点”,我是删除它还是将其标记为打开和关闭?如果管理员决定为用户选择 2 个“地点”,怎么样?更改第一个“地点”并添加额外的“地点”。我的桌子会继续增长吗?我会有多余的信息吗?

谢谢。

【问题讨论】:

    标签: mysql database normalization


    【解决方案1】:

    表 1 和表 2 听起来是正确的。表 3 不应包含 place_name。相反,您应该同时拥有对 table1_id 和 table2_id 的外键引用(您可以选择保留 table3_id)。这使得 table3 成为 junction table。

    当您想为用户删除地点时,您将删除 table_3 中的一行(仅此而已)。添加地点时,首先检查它是否存在于表 1 中。如果不存在,则将其添加到表 1。然后,将一行添加到表 3。更改(例如,在 UI 中为用户重命名地点)应该被分解成删除然后添加。

    这将避免冗余信息。

    【讨论】:

      【解决方案2】:

      您如何处理这取决于您的应用的需求。例如,您是否需要知道某个地点何时被删除?

      最简单的方法是,每当为用户更新地点时,只需删除所有地点,然后重新添加已选择的地点。

      因此,如果取消选择所有地点并添加一个新地点,它将如下所示:

      delete from UserPlace where UserID = 42;
      insert into UserPlace (UserID, PlaceID) values (42, 123);
      

      【讨论】:

        【解决方案3】:

        删除记录可能会影响 MySQL 中的 concurrent inserts,因此使用 on/off 列而不是 DELETE 可能是未来的优化。

        您可以在多个列上设置UNIQUE 索引,确保任何给定的人员/位置组合只存在一条记录。在这种情况下,INSERT … ON DUPLICATE KEY UPDATE syntax 可以简化查询,尤其是在位置被删除后重新启用时。

        使用此设置,您需要一些维护脚本,该脚本每天/每周/任何时间运行到 DELETE“关闭”记录,然后是 OPTIMIZE TABLE。

        所以,这是一种方法。

        【讨论】:

          猜你喜欢
          • 2011-02-06
          • 2011-11-04
          • 2011-12-16
          • 2013-07-17
          • 1970-01-01
          • 1970-01-01
          • 2011-05-18
          相关资源
          最近更新 更多