擅长:python、mysql、java
<p>请不要在字符域中存储列表/数组。这是一个真正的痛苦,你现在才开始看到它的开始。你知道吗</p>
<p>像平常一样,使用边桌并在边桌上连接。在边表中存储<code>(channel_id, content_id)</code>对。你知道吗</p>
<p>如果您对此有性能问题,另一种方法是使用PostgreSQL数组类型的字段。所以您将内容列表存储为<code>uuid[]</code>。不过,这只有在psycopg2和Django的ORM thingy能够理解并使用数组时才有用。根据您所做的工作,数组(相对于关系边表)可能是一个很大的性能增益,也可能是一个很大的性能缺点。这在很大程度上取决于工作量。你知道吗</p>
<p>请参阅<a href="https://dba.stackexchange.com/q/55871/7788">this related question</a>,其中讨论逗号分隔字段。你知道吗</p>
<p>如果使用数组,则无法正确执行引用完整性检查、无法轻松强制唯一性等。此外,当更新元组数组字段的一小部分时,<strong>由于MVCC,整个元组通常会被复制并再次写入。所以数组可以产生大的写放大,小的变化会导致大的写放大。你知道吗</p>
<p>另一方面,使用数组可以提高数据的局部性。如果你有主元组,那么得到数组要快得多。它很可能被压缩存储在TOAST表中,但它仍然都在一个地方,不可能分散在需要索引扫描、连接和过滤器来累积的多个块中。你知道吗</p>
<p>除非你知道仅仅有一个带有内容id列表的边表对你来说效果不好,否则这就是你应该做的。如果您有性能问题,在考虑更改数据模型以使用数组之前,请先研究适当的索引、真空等。你知道吗</p>