1

我有 2 个列表,我无法在脑海中处理我应该做什么来完成下一步的逻辑。

版本:

Django 1.5.4
Python 2.7
PostgreSQL 9.3

模型:

class Channel(models.Model):
   contentlist = models.CharField(null=True,max_length=255555)

class Content(models.Model):
   contentid = UUIDField(unique=True,editable=False)

表 app_channel.entry1.contentlist: [u'3e46340c-9601-4183-9ffc-8de01e456686', u'7a413dd3-6aa8-4c49-be20-b6f4366c0801']

表 app_content.entry1.channelid: 3e46340c-9601-4183-9ffc-8de01e456686

表 app_content.entry5.channelid: 7a413dd3-6aa8-4c49-be20-b6f4366c0801

我想我需要一个返回过滤查询的视图查询,但我不确定如何专门挑选 u',因为它不仅仅是一个我可以循环查询的数组。

这些结果也可能有成千上万的回报,所以我需要最实用的方法来做到这一点。我不希望任何人为我写下答案,但指出我正确的方向会很棒。

提前感谢任何有帮助的人。

4

2 回答 2

2

请不要在字符字段中存储列表/数组。这是一个真正的痛苦,你现在才开始看到它的开始。

像往常一样使用边桌并加入它。将一对存储(channel_id, content_id)在边桌中。

如果您对此有性能问题,另一种方法是使用 PostgreSQL 数组类型字段。因此,您将内容列表存储为uuid[]. 不过,这仅在 psycopg2 和 Django 的 ORM 可以理解和使用数组时才有用。根据您正在做的事情,数组(与关系边表相反)可能会带来很大的性能提升,也可能会带来很大的性能下降。这在很大程度上取决于工作量。

请参阅讨论逗号分隔字段的相关问题。

如果您使用数组,您将无法正确进行参照完整性检查,无法轻松执行唯一性等。此外,当您更新元组的数组字段的一小部分时,整个元组通常会被复制并再次写入,因为MVCC。所以数组可以产生大的写入放大,小的变化会导致大的写入。

另一方面,使用数组可以提高数据的局部性。如果您有主元组,则获取数组要快得多。它很可能在 TOAST 表中被侧存储压缩,但它仍然集中在一个地方,不会分散在需要索引扫描、连接和过滤器累积的多个块中。

除非您知道仅使用带有 content-id 列表的边桌对您来说效果不够好,否则您应该这样做。如果您遇到性能问题,请在查看更改数据模型以使用数组之前查看正确的索引、真空等。

于 2014-01-05T06:55:48.963 回答
1
class Channel(models.Model):
   name = models.CharField()

class Content(models.Model):
   text = models.TextField()
   channel = models.ForeignKey(Channel)

channel = Channel.objects.get(name='foo')
for content in Content.objects.filter(channel=channel):
    print(content.text)

类似的事情......需要更多的工作;-)

于 2014-01-05T07:03:59.637 回答