3

一家与我们有业务往来的公司希望每天向我们提供一个 1.2 GB 的 CSV 文件,其中包含大约 900,000 个产品列表。每天只有一小部分文件更改,可能不到 0.5%,而且实际上只是添加或删除的产品,而不是修改。我们需要向我们的合作伙伴展示产品列表。

更复杂的是,我们的合作伙伴只能看到其邮政编码半径 30-500 英里范围内的产品列表。每个产品列表行都有一个产品实际半径的字段(有些只有 30,有些是 500,有些是 100,等等。500 是最大值)。给定邮政编码的合作伙伴可能只有 20 个左右的结果,这意味着将有大量未使用的数据。我们不会提前知道所有合作伙伴的邮政编码。

我们必须考虑性能,所以我不确定最好的方法是什么。

我应该有两个数据库 - 一个带有邮政编码和纬度/经度,并使用 Haversine 公式计算距离……另一个是实际产品数据库……然后我该怎么办?返回给定半径内的所有邮政编码并在产品数据库中查找匹配项?对于 500 英里的半径,这将是大量的邮政编码。或者写一个MySQL函数?

我们可以使用 Amazon SimpleDB 来存储数据库……但是我仍然遇到邮政编码问题。我可以像亚马逊所说的那样创建两个“域”,一个用于产品,一个用于邮政编码?不过,我认为您不能跨多个 SimpleDB 域进行查询。至少,我在他们的文档中没有看到任何地方。

我完全愿意接受其他一些解决方案。它不必是 PHP/MySQL 或 SimpleDB。请记住,我们的专用服务器是 2 GB 的 P4。我们可以升级 RAM,只是我们不能为此投入大量的处理能力。甚至每晚都在 VPS 上存储和处理数据库,如果 VPS 在处理 1.2 gb CSV 时速度慢得无法忍受,这不会是一个问题。我们甚至可以在台式计算机上离线处理文件,然后每天远程更新数据库……除此之外,我仍然遇到需要交叉引用的邮政编码和产品列表的问题。

4

2 回答 2

2

您可能想研究 PostgreSQL 和Postgis。它具有与 MySQL空间索引功能相似的功能,而无需使用 MyISAM(根据我的经验,与 InnoDB 相比,它往往会损坏)。

特别是 Postgres 9.1,它允许使用 GIST 索引进行k-最近邻搜索查询。

于 2011-06-07T21:27:46.253 回答
1

嗯,这确实是一个有趣的问题。

这似乎实际上是两个问题,一个是您应该如何索引数据库,第二个是您如何使其保持最新。第一个您可以按照您的描述实现,但规范化可能会或可能不会成为问题,具体取决于您存储邮政编码的方式。这主要取决于您的数据是什么样的。

至于第二个,这更多是我的专业领域。您可以让您的客户按当前状态将 csv 上传给您,保留昨天的副本并通过 diff 实用程序运行它,或者您可以利用 Perl、PHP、Python、Bash 或您拥有的任何其他工具来找到已更改的行。将它们传递到将更新您的数据库的第二个块中。我已经与客户处理过这方面的问题,编写脚本往往是最好的选择。如果您需要帮助组织始终可用的脚本。

于 2011-06-07T21:37:10.063 回答