请帮助我了解以下哪项更适合扩展和性能。
Table: test
columns: id <int, primary key>, doc <int>, keyword <string>
我想要存储的数据是指向包含特定关键字的文档的指针
设计1:
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
设计2:
insert a row for each document
1 4 google
2 5 google
3 6 google
让我们说一个特定关键字的平均文件数接近100000.关键字可能没有最大数量的文件。
答案 0 :(得分:0)
许多因素会影响扩展和性能,因此在开发早期尝试优化未知数通常不是一个好主意。
对于数据库设计,我发现通常最好采用更正确的规范化方法(您的设计2),然后担心扩展和性能(如果它成为问题)。然后,您可以根据您面临的问题对某些区域进行去标准化或采取其他方法。
由于无法将doc列与另一个表一起加入,您的设计选项1可能会立即遇到其他问题,以及更新和搜索它的复杂性。
答案 1 :(得分:0)
设计1可能受MySQL's row size limit限制。
设计2对我来说最有意义。如果您需要删除其中一个值,该怎么办?您只需删除一行而不必搜索并更新数组。这也很好,因为它允许您在必要时限制结果的大小(例如,用于分页)。
您还可以考虑在此表与关键字表之间创建多对多关系,而不是将关键字存储为字段。
答案 2 :(得分:0)
你可以忘记选项1,因为mysql中没有数组数据类型。
老实说,如果你想为这类数据提供可扩展的解决方案,我认为你应该研究一种不同类型的数据库。更多关于NoSQL和'键值对存储数据库'的研究。
使用mysql,我能想到的最好的选择是你的第二个选项,除了你应该创建另一个带有数字ID和唯一关键字列表的表。这样,当您进行搜索时,您将首先查找ID,然后按ID而不是字符串过滤大表。数字比较比字符串比较更快。