为每个“列表”创建一个新的 table 是加速数据库查询的最佳方式吗?

Is creating a new table for each `list` the best way to speed up database queries here?

我的 postgres 数据库有 listslist_items table。 list_id 列上有一个索引。为了列出列表中的所有项目,我一直在 list_items 中搜索 list_id 等于 id 的位置 lists table.

lists:

id title
0 "foo"
1 "bar"

list_items:

id content list_id
0 "hello" 0
1 "world" 1
2 "foobar" 0

但是,随着列表和列表项数量的增加,搜索 list_items 并将它们与列表匹配的时间会更长。


当前的实现对我有用。但是假设我想加快速度。我正在考虑在 lists table 中增加一个名为 items_list 的专栏。在 lists table 中创建列表时,将创建一个新的 table 并将名称存储在 items_list 中。删除列表时,items_list 引用的 table 将被删除。感觉有点别扭,不过这似乎是一个加快查询速度的好方法。

lists:

id title items_list
0 "foo" "list_0_items"
1 "bar" "list_1_items"

list_0_items:

id content
0 "hello"
1 "foobar"

list_1_items:

id content
0 "world"

如果需要,这是加快查询速度的好方法吗?

是否有我应该尝试的其他方法或数据库(例如 noSQL)?

这样的决定总是取决于您认为最终查询可能会如何结束。 如果您将索引放在查找列上,您的初始解决方案在大多数情况下都能很好地工作。然后,您可以在 运行 搜索时使用这些 ID 将 table 连接在一起。通过将列表项放入单个 table 中,您的优势在于可以轻松规范化数据,因此特定项仅在数据库中占用 space 一次。

有时您可能会对 table 进行分类,因此它可能会获得数据的子集。也许所有以字母开头的项目,但在 table 达到特定阈值之前你不会做这种事情。您的多个解决方案确实有效,但如果您想在单个查询中一起导出数据,您将需要大量 table 的联合。

如果您从不需要查找项目是什么,只想按原样导出它们,您可以考虑使用 jsonb,它允许您将 json 二进制对象直接放入您的行旁边列表详细信息。您可以查询 json 中的项目,但它不如用于快速查找的索引数据库列那样高效。 使用您的示例,您最终会得到一个 table.

id title list_items
0 "foo" ['hello','foobar']
1 "bar" ['world']

如果您有更多与每个项目相关的数据,那么您可以使该项目成为键或值(取决于您的用例)来制作字典甚至是数据树。

id title list_items
0 "foo" {'i1':'hello','i3':'foobar': null}
1 "bar" {'i2':'world'}
id title list_items
0 "foo" {'hello':{'note':'hello info'},'foobar': null}
1 "bar" {'world':{'note':'some notes'}}