0

请帮助我了解以下哪项更适合扩展和性能。

Table: test
columns: id <int, primary key>, doc <int>, keyword <string>

我要存储的数据是指向包含特定关键字的文档的指针

设计一:

have unique constraint on the keyword column and store the list of documents as an array
e.g id: 1, doc: [4,5,6], keyword: google

设计二:

insert a row for each document  
1 4 google  
2 5 google  
3 6 google 

假设可以找到特定关键字的平均文档数接近 100000。可能没有关键字出现的最大文档数。

4

3 回答 3

0

很多因素都会影响扩展和性能,因此在开发早期尝试优化未知数通常不是一个好主意。

对于数据库设计,我发现通常最好使用更正确的规范化方法(您的设计 2),然后担心缩放和性能是否成为问题。然后,您可以根据您面临的问题对某些区域进行非规范化或采取其他方法。

您的设计选项 1 可能会更直接地遇到其他问题,因为无法将 doc 列与另一个表连接,以及更新和搜索它的复杂性。

于 2012-10-26T05:50:42.307 回答
0

设计 1 可能受到MySQL 的行大小限制的限制

设计 2 对我来说最有意义。如果您需要删除其中一个值怎么办?您只需删除一行,而不必搜索和更新数组。这也很好,因为它允许您在必要时限制结果的大小(例如,用于分页)。

您还可以考虑在此表和关键字表之间创建多对多关系,而不是在此处将关键字存储为字段。

于 2012-10-26T06:03:02.610 回答
0

您可以忘记选项 1,因为 mysql 中没有数组数据类型。

老实说,如果您想要针对此类数据的可扩展解决方案,我认为您应该研究另一种类型的数据库。更多地研究 NoSQL 和“键值对存储数据库”。

使用 mysql,我能想到的最好的选择是您的第二个选项,除了您应该创建另一个具有数字 ID 和唯一关键字列表的表。这样,当您进行搜索时,您将首先查找 ID,然后通过 ID 而不是字符串过滤大表。数值比较比字符串比较快。

于 2012-10-26T06:24:51.723 回答