0

This question has been already asked but I've not found a "1 voice answer".

Is it better to do :

  • 1 big table with :

user_id | attribute_1 | attribute_2 | attribute_3 | attribute_4

  • or 4 smal tables with : user_id | attribute_1

user_id | attribute_2

user_id | attribute_3

user_id | attribute_4

1 big table or many small tables ? Each user can only have 1 value for attribute_X. We have a lot of data to save (100 millions users). We are using innoDB. Performance are really important for us (10 000 queries / s).

Thanks !

François

4

2 回答 2

1

如果您坚持零、一或多原则,即没有这样的事情、其中之一或无限数量,您将始终构建适当的规范化表来跟踪此类事情。

例如,一个可能的模式:

CREATE TABLE user_attributes (
  id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  user_id INT NOT NULL,
  attribute_name VARCHAR(255) NOT NULL,
  attribute_value VARCHAR(255),
  UNIQUE INDEX index_user_attributes_name(user_id, attribute_name)
);

这是基本的键值存储模式,每个用户可以有许多属性。

尽管这方面的存储要求比固定列排列的存储要求更高attribute1,但在 TB 级硬盘驱动器的时代,成本已经足够小了,这几乎不是问题。

通常,您会为此数据创建一个表,直到插入时间成为问题。只要您的插入速度很快,我就不会担心。此时,您可能需要考虑一种分片策略,将这些数据划分为具有相同架构的多个表,但前提是必须这样做。

我想这将处于 ~10-50 百万行阶段,但如果此表中的插入活动量相对较低,则可能会更高。

不要忘记优化读取活动的最佳方法是使用缓存:最快的数据库查询是您不进行的查询。对于这类事情,您通常会使用memcached之类的东西来存储先前提取的结果,并且您会在写入时使其无效。

与往常一样,在生产规模上对任何提议的模式进行基准测试。

于 2012-12-10T22:10:32.230 回答
0

1 个大表:user_id | 属性_1 | 属性_2 | 属性_3 | 属性_4

将使您的管理更轻松。否则,太多的单独查找也会使针对数据库的编程变得复杂,并有可能增加应用程序错误。

于 2012-12-10T22:24:27.297 回答