Quu*_*rks 3 postgresql database-design
我的数据库有 VARCHAR 列,每个列包含 20k-60k 不同的短文本。将这些值存储在每一行中是不可行的(由于空间限制),它们需要以某种方式外部化。这些值永远不会更新。
经典的方法是用单独的查找表和相应的 id 替换这些列中的每一个 - 然而,这需要大量的连接和大量类似的表。
枚举对于这个问题似乎不可行,尽管它们会消除显式连接的需要:它们不能超过 63 个字节,并且在版本 10 之前不可能在事务中添加新值。
我查看了 CREATE TABLE 的文档 - 似乎没有对这种重复数据删除的内置支持。TOAST-Tables 似乎也不包含唯一值。
我错过了另一种方法吗?
许多连接正是通常的方法。
但是,您可以编写一个非STRICT LANGUAGE sql函数,如通过 id 从查找表lookup_mytext(id)中执行 a SELECT。PostgreSQL 会将其作为子查询内联,然后将子查询展平为连接。所以效果是一样的,但在符号上写起来更简单
SELECT
x,
lookup_mytext(y)
FROM t;
Run Code Online (Sandbox Code Playgroud)
比
SELECT
t.x, tt.val
FROM
t INNER JOIN tt ON (t.y = tt.id);
Run Code Online (Sandbox Code Playgroud)
大多数时候我更喜欢避免混淆并保持显式连接。但如果这是整个应用程序的真实模式,它就会变得有益。
有关函数内联的规则,请参阅文档。与EXPLAIN.
| 归档时间: |
|
| 查看次数: |
744 次 |
| 最近记录: |