简短描述:
需要在php中使用散列算法解决大量文本值。
详细说明。
PRODUCT_OWNER_TABLE
serial_number (auto_inc), product_name, owner_id
OWNER_TABLE
owner_id (auto_inc), owener_name
我需要维护一个包含200000个独特产品及其所有者的数据库(以及所有后续所有权变更)。每个产品都有一个所有者,但所有者可能拥有许多不同的产品。所有者名称是“Adam Smith”,“John Reeves”等,只是文本值(很可能也是unicode)。
我想优化数据库设计,所以我想的是,每周运行这个脚本时,它会获取一个引导的所有者,然后检查一个类似于PRODUCT_OWNER_TABLE的表,并获取owner_id。然后它在OWNER_TABLE中查找owner_id。如果它匹配,那么它是相同的,所以它继续前进。问题是它的不同......
为了优化数据库,我想我应该检查OWNER_TABLE中的其他“owner_name”条目,看看那里是否存在该值。如果是,那么我应该使用那个owner_id。如果它没有,那么我应该添加另一个条目。
请注意,“名称”没有什么特别之处。只要我保持正确的linkagaes并使OWNER_TABLE成为“只读,追加新”类型表 - 我应该能够创建一个所有权的历史档案。
我需要检查200000个条目,我不知道有多少个唯一的所有者名称(~50000?)。我想我需要一个哈希解决方案 - OWNER_TABLE不会被排序,所以搜索算法不会是最优的。
编程语言是PHP。数据库是MYSQL。
答案 0 :(得分:0)
您提出的建议是复杂的,难以维护的,冗余的,并且不会改善功能或性能。
这是一个简单的一对多关系 - 因此产品表应包含一个引用所有者表的外键(您的数据似乎有)。但我无法想象你在哪里有一个场景,你在外键中有一个非空值,它没有引用所有者表中的值。
使用代理键(自动增量值)会使问题变得复杂。根据您的描述,所有者的真实唯一标识符是owner_name - 在这种情况下,由于MySQL本身不支持约束,因此要在owner.owner_name上创建唯一索引 - 并始终尝试在那里插入值添加产品或更改产品的所有者 - 您可以指定查询忽略重复项 - 然后,如果此查询返回的affected_rows为1,则获取insert_id,否则轮询已存储的密钥。
下进行。
答案 1 :(得分:0)
+1 200000记录不是那么大MySQL可以处理更多。恕我直言,这里唯一的设计是最简单和最有效:与密钥上的索引的一对多关系(所有者表上的主要表和产品表上的外部表)。
如果您的优化旨在更快地获得结果或减少服务器负载,并且您的记录更改或被删除/重新插入,您可以尝试OPTIMIZE
OPTIMIZE TABLE `Owner`;
OPTIMIZE TABLE `Product`;
如果您得到奇怪的排序或错误的结果,您的数据库已损坏。在完全功能系统上的常规MySQL上不会发生这种情况,但您可以rebuild the whole tables。
(为mysql 5.0提供链接,调整以获取您的版本文档)