作者powerup (东刀轮一流)
看板Database
标题[系统] 正规/反正规化的取舍
时间Fri Jun 8 19:22:37 2012
各位前辈好,有些关於资料库规划的问题想请问一下
小弟目前的专案有点像会员制的google reader 一样,使用者可以自订阅其想要的网站
原先资料库的规划是根据一般的正规化那样:
网站统一管理在一个table,每笔网站资料都有一个ID
使用者的订阅资讯用另一个table管理,订阅的东西用text或BLOB储存
就像这样:
----------------- ----------------
| user | value | | id | name |
----------------- ----------------
| A | 1,5,7,8| | 1 | yahoo |
----------------- ----------------
| B | 2,4 | | 2 | engadge|
----------------- .
.
但是现在主管想要增进我们资料库的效能,不管空间浪费(因为现在硬碟很便宜)
所以他要求用反正规化的方式,亦即每一个使用者都用一个资料表
彼此订阅的网站互不干涉,资料重复没差
这样子资料存取会比较快,因为不用做where查询,使用者越多越明显(跟原先的结构比)
而且同步也方便(我们之後会有许多台伺服器,会有资料库同步问题)
因为原先的结构是储存id,如果同一个网站在不同伺服器有不同的id同步会很麻烦
但是这样的话,资料库里会有一堆user table耶!
这样会不会资料库的执行或管理上面会有问题啊? 从来没想过要这样作,我完全没概念
毕竟这作法和书本上及我在版上看的资料大不相同
所以想请问各位前辈这样作,是否真的有其根据?
又,一般网路游戏或其他有会员制的的专案是怎麽管理庞大的会员资料的啊
(约数十万笔以上,而且会员数会一直增加)?
就算是分散式资料库,也只是把不同table分散到不同伺服器而已啊
我朋友说mysql一个资料表要维持最高效能,所储存的资料大约只有十万笔
所以可以每十万笔资料换一个资料表,也就是有user_table1, user_table2之类的
这样在做查询时,还要先作数学运算看这个使用者是在哪个资料表......
请各位前辈能不吝指点,或是给我一个连结或一本书,一个方向
因为之前都没处理过这麽多资料的资料库,不知从何着手
不限任何方式或资料库种类,我甚至考虑过乾脆用档案来存资料
反正主管都说一个使用者一个资料表了,那我一个使用者一个档案也可以啊....
感谢您能看完小弟的冗长文章,谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.128.209.67
1F:→ alpe:靠, 我又用到回信. 帮我贴上来吧 06/08 21:01
2F:→ alpe:php版 [请益] 资料库规划问题 (MySQL) 也可以看一下 06/08 21:05
3F:推 danielguo:你需要的是sharding, 例如机器A放使用者1-10,B放11-20 06/09 00:18
4F:→ danielguo:一个使用者建一个表坏处远大於好处 06/09 00:18
5F:→ danielguo:MySQL 最佳效能不是十万笔, 是 index 可以放进记忆体 06/09 00:20
6F:→ danielguo:可以用内建的 partioning 达成, 不一定要手动建 1, 2, 3 06/09 00:21
7F:→ danielguo:sharding 同一个表分散到不同伺服器,查询时查表看是哪台 06/09 00:23
8F:→ danielguo:但要追求效能还有很多其他方式可以先做 06/09 00:24
9F:→ powerup:谢谢各位的指点,我要好好研究一下,这样我才能说服主管 06/11 10:38
10F:→ powerup:希望他能打消五百万个table的想法,不然我之後会很想死... 06/11 10:42
11F:→ powerup:请问dan大有哪些其他提高效能的方式可作呢? 06/11 10:45
12F:→ powerup:因为最近资料库要重构来因应新spec,顺便想想如何提高效能 06/11 10:48
13F:→ powerup:所以主管才会有反正规化的想法出现... 06/11 10:49
14F:推 petertc:partition只是分不同表吧,没有分到不同台 06/13 23:01
15F:→ adrianshum:这叫反正规?乱来 06/17 00:55