【发布时间】:2015-02-06 14:00:58
【问题描述】:
假设我有一个模块。我构建了一个界面,用户可以在其中将模块分配给组。 可以说目前我有 3 个组。在 UI 中,用户将选择所有 3 个组来将模块分配给他们。例如在多个选择框中。
用户的意图是将模块分配给所有组。
我想我需要一个多对多关系表。我的源代码会执行一个 sql 查询来插入 3 个条目。
但是等等。如果两周后管理员添加了一个新组怎么办...在关系表中只有 3 个条目。用户想知道为什么模块没有分配给新添加的组。
什么是优雅的解决方案?我需要确定更新关系表,或者我在我的模块表中创建一个新列 - 称为“组” - 我以这种格式添加分配的 groupsId:“1;2;7;15”或关键字“全部”。 优点是使用关键字“All”,我可以在我的代码中知道该模块已分配给所有组。 使用关系表我没有这个选项。此外,我不需要将组分配给模块。我只需要将一个模块分配给组。 在我看来,在这种情况下我不需要关系表。
你会说什么?还是您有其他方法?
【问题讨论】:
-
如果值得做,那就值得做好。规范化您的数据库并相应地编写您的 UI。
-
我会使用关系表,除非一个模块与所有现有组有关系,您只需插入 1 行,如
[moduleID; 'ALL']。这样您就不必处理在groupcolumn 中拆分字符串。 -
在组表中设置外键“模块”
-
不要在数据库中添加像“All”或null或类似的东西作为具有语义意义的关系键。而是在您的 UI 中处理您创建新数据以在关联表中插入相关/需要的数据。允许数据库使用引用完整性和易于连接语句比必须执行此类逻辑更好 - 将为您提供最佳性能、最佳可维护性和最佳数据完整性
-
您的第一个问题是您将 datbase 视为 UI 的事后考虑。 UI 将做什么或不做什么与数据库的正确设计无关。您需要考虑数据库规范化术语来设计表结构,而不是根据您的 UI 将要做什么。
标签: sql