这是我的3张桌子:
表1 - 存储用户信息,并且具有唯一数据
表2 - 存储地点类别,例如,多伦多,纽约,伦敦等,因此这也是独一无二的
表3 - 有重复的信息。它存储用户所有的地方。
通过这些ID链接或连接3个表:
表1有一个“table1_id”
表2有一个“table2_id”和“place_name”
表3有一个“table3_id”,“table1_id”,“place_name”
我有一个管理员可以看到所有用户的界面。在用户旁边是“编辑”按钮。单击该编辑按钮,您可以在表单字段中编辑特定用户,该表单字段具有“地点”的多个下拉框。
如果管理员编辑用户并为用户添加1“位置”,我使用php插入该信息。如果管理员决定取消选择1个“地点”,我是删除它还是将其标记为开启和关闭?如果管理员决定为用户选择2个“位置”,该如何;更改第一个“地点”并添加其他“地点”。我的桌子会继续增长吗?我会有多余的信息吗?
感谢。
答案 0 :(得分:3)
表1和表2听起来不错。表3不应包含place_name。相反,您应该对table1_id和table2_id都有外键引用(您可以选择保留table3_id)。这使table3成为junction table。
如果要删除用户的位置,您将删除table_3中的一行(就是这样)。添加地点时,首先检查它是否存在于表1中。如果没有,则将其添加到表1.然后,向表3添加一行。更改(例如,在UI中为用户重命名地点)应该被分解为删除然后添加。
这样可以避免冗余信息。
答案 1 :(得分:0)
您如何处理这取决于您的应用程序的需求。例如,您是否需要知道某个地点何时被删除?
最简单的方法是,每当为用户更新场所时,jsut都会删除所有场景,然后重新添加所选场景。
因此,如果所有地点都被取消选中并添加了新地点,那么它将如下所示:
delete from UserPlace where UserID = 42;
insert into UserPlace (UserID, PlaceID) values (42, 123);
答案 2 :(得分:0)
删除记录有可能影响MySQL中的concurrent inserts,因此拥有一个开/关列而不是DELETE
可能会成为一种优化。
您可以在多个列上设置UNIQUE
索引,确保任何给定的人/位置组合只存在一条记录。在这种情况下,INSERT … ON DUPLICATE KEY UPDATE
syntax可以简化查询,尤其是在删除位置后重新启用位置时。
通过此设置,您可能需要一些每天/每周运行的维护脚本/ DELETE
“关闭”记录,然后OPTIMIZE TABLE
。
所以,这是一种方法。