【发布时间】:2017-08-08 15:50:51
【问题描述】:
这是一对多关系的典型情况:一个聊天群 iOS 应用,一个群表,记录所有群聊相关信息,如群 id、创建时间、线程标题等。
当然,为了记录参与者,我假设还有另一个 1:m 表。所以我很惊讶地看到该应用程序刚刚添加了另一个名为“参与者”的列来记录它,每个参与者都用分隔符分隔(准确地说是“:”)。问题很明显,将应用程序代码与 sql 代码混合,例如无法通过sql代码查看特定用户在多少组中,违反了1NF / 2NF等。
但他们说我们理解你的所有观点。但是
- 因为这是一个移动应用程序,你总是需要使用客观的c代码来访问sqlite表,你不会单独使用sql代码。因此,将它们混合在一起并不是什么“大事”。
- 参与者不会经常更改,通常在创建组时设置。如果我们有 100 个参与者,我们宁愿只将 1 条记录插入到组表中,而不是将 100 条记录插入到另一个组参与者表中。
当有人想查看谁在这个聊天组中(通过在菜单上点击几下)以及当有人加入或离开聊天组时,将使用参与者数据,假设它不会经常发生。
所以我的问题是,在这种特殊情况下,如果我使用另一个 1:m 表,我将获得什么优势?
-----更新-----
除了我得到的答案,Renzo 好心把这个discussion 指给我,这也很有帮助!
【问题讨论】:
-
您可以获得标准化的所有好处。以 CSV 格式存储数据通常是不可取的,因为它使数据难以(并且可能很慢)查询和更新。也许如果他们只需要一次获得所有用户,那还不错。
-
感谢 cmets。但正如我在我的问题中所说,在这种特殊情况下有什么优势,例如您能否更具体地了解“标准化的好处:这里?
-
我们无法在不知道他们如何使用 CSV 数据的情况下回答这个问题。与维护 1:N 表相比,使用 CSV 数据快速更新聊天室中的用户名册应该更慢(我认为)
-
添加有关何时使用它们的信息。
-
participants don't change often... 在这种假设下,存储 CSV 的惩罚会更少,因为这意味着不经常更新。
标签: sqlite database-design data-modeling