2011-07-10 71 views
1

我有一个数据库中有数百万条记录。哪个是最好的无损数据库压缩技术

表具有两个属性1]名称2]位置

有多条记录,其具有不同的名称,但相同的位置,这样是有可以在位置属性被应用于任何压缩技术?

您可以使用支持的数据库名称来推荐各种无损压缩技术。

+0

刚刚[正常化数据库](http://en.wikipedia.org/wiki/Database_normalization)怎么样? – hammar

+0

为什么要压缩数据?你真的有空间问题,或者你只是试图过早地优化大小?你应该考虑如果你成功了会发生什么,你将如何查询数据库的位置?无论如何,是否有可能拥有一个位置表,并且只是存储一个参考?据推测(但你必须检查)如果有很多位置被重用,int类型的引用总共占用的空间会更少。 –

+0

看起来像功课。 – Bytemain

回答

4

Normalise your database。有一个LOCATIONS表,并给你的第一个表的外键。

不到65535个不同的位置?这是原始表中每个记录的两个字节。如果你问我,相当不错的压缩。也使索引和比较更快。

数据比代码更重要。首先获取数据。 尽可能标准化默认。只有在您发现(特定的,测量的和完全归因的)性能问题或某些重要原因后才能进行非规范化。

+0

你会写请查询来规范我的数据库吗 – Vivek

+0

这不是一个查询,它是你如何创建数据库的第一个地方。在迁移过程中可能会涉及到一些查询,例如“INSERT INTO locations SELECT FROM ...”(我忘记了确切的语法),然后是“UPDATE addresses SET SET location_id =(SELECT id FROM locations ...”,然后删除多余的旧列 – spraff

+0

@sam:你总是可以在你的表格中添加一个纬度/经度对,并使用一个空间索引 – Bytemain

0

你想寻找一个空间索引。 Si将复杂度降低到1d。一个si用于地图和treemaps。它看起来像一棵四叉树。

+0

呵呵,首先我以为你完全错过了这一点,然后我意识到**我有** !是的,如果地址是地址这样的字符串,那么请阅读我的答案 - 如果地点是纬度/经度或其他东西,那么你需要离散数据。 – spraff

+0

对不起,先生,请你详细说明你的意思吗?一个离散函数的例子吗?或者是一个空间索引离散函数?我有一个糟糕的一天 – Bytemain

+0

是的,它可能是连续的值,但如果你把宇宙分成一半并说“(x1,y1)在左边,(x2,y2)在右边“,那么你有一个1位离散值来区分这些点。其他示例有[矢量量化](http://www.gamasutra.com/view/feature/3090/image_compression_with_vector_.php),八叉树寻址等。关系数据库不会自然处理,但它们可以存储BSP“路径“作为一个普通的整数。 – spraff