为自定义排序顺序存储逗号分隔值的缺点

时间:2014-03-19 09:07:34

标签: mysql sql database sorting

我们正在使用一个Web应用程序(Ruby / Rails + Backbone,jQuery,Javascript),用户可以在其中管理书单并拖放书籍以重新排列列表中的顺序,这必须保留。

我们有书籍和一本名为booklist的书籍自定义集合,我们有两个表:书和书单。由于一本书可以属于多个书单,并且书单由多本书组成,因此它们具有m×n关系,并且我们还有另一个表来存储该映射。让我们说我们将它用于所有目的。现在,当用户想要在她的书架中重新订购书籍时,我们需要存储该订单。

我完全可以看到why storing ids in a column is evil的感觉,对它毫无疑问。如果我们将表标准化,并且对于所有其他情况,我们将通过标准操作。

are quite a few approaches有关存储其他订单列的信息。但是,即使假设保持完整性,将书籍的ID存储在书单列表中的逗号分隔列表中仍然是不好的设计。

我们永远不会遇到this ......

SELECT * FROM users WHERE... OH F@$%CK - 
     

是的,这很糟糕,你不能在不依赖的情况下订购,统计,求和(等)甚至做一个简单的报告   在顶级语言上。

因为我们只是使用连接表(如标准方法)根据booklist id选择书籍。 (无论如何,我们只是将书籍作为一个阵列作为骨干书单模型的一部分)

那么,如果我们检索书单的书单和书籍,基于CSV列以编程方式在客户端(在本例中为Javascript?)进行排序。

出现是一个简单的解决方案,因为:

  • 每次用户重新订阅图书时,我们只会再次将所有ID存储在此一个列中。 (用户将在书单中拥有最多20到30本书。)
  • 我们当然可以简单地忽略无效的ID,即在创建书目表后删除的书籍。

这种方法有哪些缺点,这似乎比维护排序顺序和每次更改订单时更新其他列,或使用浮点数或权重等更简单。

1 个答案:

答案 0 :(得分:1)

据我所知,它确实违反了RDBMS的规则。在应用JOIN时,这会导致许多困难。

希望它会对你有所帮助。