对于一个简单的聊天室而言,大致上只需要User资料表记录使用者,Message资料表纪录讯息内容、发送方使用者、接受方使用者、时间戳等等。
问题是,如果是多人聊天室,当A发一笔讯息时,聊天室有500个成员,这时Message资料表就会瞬间新增至少499笔,显然有优化的选项。
资料库正规化
换个角度想,把要发送的对象抽出来,由另外一张表负责记录聊天室的成员。这样一来,不管讯息新增几笔,Message资料表只需要记住是哪一个聊天室Id,便可以知道该发送给谁。
也就是资料库正规化的第二级原则。
*上图的Message资料表,我先省略"发送方使用者"的栏位及关连,让图示更清楚些。
在设计资料库时,正规化的原则可以增进资料库效能、减少储存记忆体浪费。
正规化有三个阶段:
(1) 第一级正规化 1.消除每个资料表中同类型的栏位 (例如: Message资料表有两个栏位-接受者1、接受者2,合併成接受者一个栏位) 2.使用一个**主键值(PK)**来识别每一笔资料 (例如: Message资料表有Id,跟身分证一样,可以区分不同笔资料)
(2) 第二级正规化 1.会重複出现的栏位资料,拆分独立的资料表 2.透过一个外来键值(Foreign key)来关联这些资料表的资料
(3) 第三级正规化 1.消除与主键无关的栏位 (例如: Message表有使用者资讯UserPhone,很容易在资料异动时出错) 2.**消除递移关係** ( X->Y,Y->Z 所以X->Z。例如: 总金额 = 商品单价* 数量, 这时可能不适合把总金额栏位和数量放在同一张表, 数量异动时可能会造成总金额错误)
正规化就是减少资料重複、减少资料错误,但同时会造成查询变複杂(需要JOIN),所以依照需求和资料量设计资料库才是王道。
下一篇: 聊天软体实作(2):从读写需求评估资料储存