在我的Rails应用程序中,我想将位置列字段的地理边界存储在数据库中。例如,纽约的边界被表示为多边形:阵列的阵列。
我已经声明我的模型要序列化多边形,但我不确定是否应该这样存储它们。这些序列化的多边形的大小很容易超过100000个字符,MySQL在一个标准的TEXT字段中只能存储大约65000个字符。
现在我知道MySQL也有一个LONGTEXT字段。但我真的希望我的应用程序与数据库无关。Rails自己是如何处理这个问题的?它会自动切换到LONGTEXT字段吗?当我开始使用PostgreSQL时呢?
在这一点上,我建议您问问自己——这些数据需要存储,还是应该以这种格式存储在数据库中?
我提出了两种可能的解决方案:
-
将多边形存储在文件系统中,并从数据库中引用它们。这样大的数据项在数据库中用处不大——将它们作为文本进行查询实际上毫无意义。文件系统擅长存储文件-使用它。
-
如果数据库中确实需要这些多边形,请将它们存储为规范化数据有一个名为polygon的表和另一个名为point的表,反序列化多边形并以反映数据库使用方式的方式存储它。
希望这能有所帮助。
Postgresql有一个名为PostGIS的库,我的公司使用它来处理几何位置和计算,在这种情况下可能非常有用。我相信postgresql还有两种数据类型,它们允许数组和散列。例如,数组的声明类似于text[]
,其中文本可以用另一种数据类型替换。哈希可以使用hstore模块定义。
这个问题回答了我的部分问题:Rails将默认字节限制设置为65535,您可以手动更改它。
总而言之,在那之后你是否会遇到麻烦取决于你使用的数据库。对于MySQL,Rails将自动切换到相应的*TEXT字段。MySQL可以存储高达1GB的文本。
但正如benzado和thomasfedb所说,最好将信息存储在一个文件中,这样数据库就不会分配大量甚至可能不会使用的内存。
即使可以将此类内容存储在数据库中,也应该考虑将其存储在外部,只需在数据库中放入URL或其他标识符即可。
如果它在数据库中,当你不打算使用它时,你可能会将64K的数据加载到内存中,仅仅因为你访问了该表中的某些内容。而且,扩展只读文件集合(使用类似AmazonS3的东西)比扩展数据库表更容易。