2017-09-02 37 views
0

我有一个Django的Web应用程序与Postgres的数据库;一般的操作是每天都有一组需要存储在其中一个表中的值。 没有可预见的需要查询数组的值,但需要能够绘制特定日期的值。 问题是这个数组非常大,如果我将它存储在数据库中,我每年会有6000万行,但是如果我将每行存储为一个blob对象,那么每年将有6万行。django数据库设计时,你会有太多的行

是是使用Blob对象,以减少表的大小,当你不想与值的行来查询一个很好的决定? 这里有两种选择:

选项1:保持所有

group(foreignkey)| parent(foreignkey) | pos(int) | length(int) 
    A    | B     | 232  | 45 
    A    | B     | 233  | 45 
    A    | B     | 234  | 45 
    A    | B     | 233  | 46 
... 

选项2:折叠数组到一个blob:

group(fk)| parent(fk) | mean_len(float)| values(blob) 
    A  | B   | 45   |[(pos=232, len=45),...] 
... 

,所以我不希望查询POS或长度,但我想查询组或父母。 一个是我说的读取查询的例子是:

SELECT * FROM "mytable" 
LEFT OUTER JOIN "group" 
ON ("group"."id" = "grouptable"."id") 
ORDER BY "pos" DESC LIMIT 100 

这是一个典型的Django管理list_view页主查询。

+1

如果真的没有必要对数据进行查询(使用SQL),然后是啊,只是存储一个blob – Strawberry

+0

在另一方面 - 什么是这种分组的好处是什么?如果一个表格正确完成(索引等),那么理论上应该没有严重的性能差异。如果做得不正确,那么规范化的表单应该会导致更快地发现问题。 (通过我可能是错误的,我没有在实践中这样做,只是纯粹的理论。) – Sasha

+0

有一些成长的行的性能情节会有帮助,但我找不到任何。我会试着嘲笑大数据来看看会发生什么。 – max

回答

0

我试图加载数据,并试图显示在Django管理页面的表格没有做任何复杂的查询(只是读查询)。 当我通过150万行时,管理页面冻结。它只需要在该表上进行一些计数查询来导致应用程序崩溃,所以我绝对应该将数据保存为blob,或者不要将其保存在数据库中,而是使用文件系统。

enter image description here

我想强调的是,我使用的Django 1.8作为我的测试平台,所以这是不是一个Postgres的评价,而是与Django管理和Postgres的系统评价。

+0

这是一个答案。欢迎提供其他建设性答案。我花时间来描述场景,提供架构示例并显示性能变化。 – max

+0

谢谢,我明白了。 PS看到我对这个问题的评论。你为什么认为一年中有60个变得太大?为了什么?为什么你要“显示”数百万行?什么是“一些计数查询”?什么数据被用于什么目的?您可以为不同目的更新多个表格。你会得到更好,更具体的答案更清晰,更具信息性的问题。 – philipxy

+0

我明白你的观点。我修改了我的问题和答案。我的意思是关注django,而不是一般的数据库评估。 – max