百度笔试题--论坛数据库表设计
轉載地址:http://blog.sina.com.cn/s/blog_542a862901000cbq.html
二、?一個簡單的論壇系統,以數據庫儲存如下數據:
用戶名,email,主頁,電話,聯系地址,發帖標題,發帖內容,回復標題,回復內容。
每天論壇訪問量300萬左右,更新帖子10萬左右。
請給出數據庫表結構設計,并結合范式簡要說明設計思路。
簡評:
這道題也與百度的業務有關,百度現在除了搜索外,還有貼吧,知道,博客等重要產品。 同時也在積極的探索社區化,包括前不久宣布進軍電子商務領域,搜索之外的這些產品, 其主要功能的實現主要是對數據庫的操作。 因此,想進入百度,也需要對數據庫有一定的認識。 ? 實現思路及數據庫設計:1,該論壇主要有兩個實體對象,用戶和帖子;對于帖子對象,有一個問題:回復的帖子是否應該跟主題帖子存放在同一個表里?
考慮到每天更新10萬帖子,說明帖子數比較多,為了方便主題的呈現,我一般都把主題貼和回帖分別放在不同的表中,把主題貼和回帖分開可以提高查詢效率(300萬的訪問量每天)。
2,按照1中的思路,該論壇由兩個對象(用戶和帖子)變成三個實體對象,分別是用戶,主題帖子,回復帖子;
3,上述三個對象存在三個關系,分別是:
用戶--主題帖,一個用戶可以發0個或多個帖子,一個帖子對應一個用戶(一對多關系),
主題帖--回復帖:一個主題有0個或多個回復帖子,一個回復帖子對應一個主題(一對多關系);
用戶--回復貼:一個用戶可以回0個或多個帖,一個帖子對應一個用戶(一對多關系)。
還存在對回復貼的回復,這個考慮用fatherId來表示。
4,由于三個關系 “用戶--主題帖,主題帖--回復帖,用戶--回復貼” 都是一對多關系,根據表設計一般原則,可以將這兩個關系獨立建立表,也可以不另外建表而將一對多的關系體現在實體表中;然而,表間的連接查詢是非常耗資源的,所以應盡量減少表間連接,那么對三個關系不應該分別建表,而是把用戶的id作為主題表和回帖表的外鍵,把主題貼id作為回帖表的外鍵。
5,鑒于以上考慮,該論壇的三個表如下所示
表名:t_user_info (用戶信息表)
?
| 字段名? | ?類型 | ?缺省值 | ?中文含義 | ?約束? | ?備注? |
| ?id? | ?Int | ? | ?用戶編號? | ?PRI | ?Auto_increment |
| ?Name? | ?Varchar(30)? | ? | ?用戶名 | ? | ? |
| ?Email? | ?Varchar(50) | ? | ? | ? | ? |
| ?Phone? | ?Varchar(30)?? | ? | ? | ? | ? |
| ?Addr | ?Varchar(200) | ? | ? | ? | ? |
表名:main_content_info (主題帖信息表)
| 字段名? | 類型? | ?缺省值 | ?中文含義 | ?約束 | ?備注 |
| ?id | ?Int | ? | ?貼編號 | ?PRI | ?Auto_increment |
| ?Title | ?Varchar(200) | ? | ?發帖標題 | ? | ? |
| ?Content | ?Text | ? | ?發帖內容 | ? | ? |
| ?UserID | ??Int | ? | ?用戶編號 | ? | ?外鍵 |
其他字段略,根據需要添加
?
?表名:sub_content_info (回復貼信息表)
| ?字段名 | 類型? | ?缺省值 | ?中文含義 | 約束? | 備注? |
| ?id | ?Int | ? | ?貼編號 | ?PRI | ?Auto_increment |
| ?Title | ?Varchar(200) | ? | ?發帖標題 | ? | ? |
| ?Content | ?Text | ? | ?發帖內容 | ? | ? |
| ?UserID | ?Int | ? | ?用戶編號 | ? | ?外鍵 |
| ?FatherID | ?Int | ? | ?父編號 | ? | ? |
| ?MainID | ?Int | ? | ?主題帖編號 | ? | ?外鍵 |
其他字段略,根據需要添加
6,符合范式分析:
上述表中每個字段不可再分,首先滿足1NF;
然后數據庫表中的每個實例或行都是可以被惟一地區分(id),不存在部分依賴,因此滿足2NF;
t_user_info (用戶信息表)和main_content_info (主題帖信息表)不存在任何傳遞依賴,至少屬于BCNF;
但是sub_content_info (回復貼信息表)不滿足3NF,因為存二、 一個簡單的論壇系統,以數據庫儲存如下數據:
用戶名,email,主頁,電話,聯系地址,發帖標題,發帖內容,回復標題,回復內容。
每天論壇訪問量300萬左右,更新帖子10萬左右。
請給出數據庫表結構設計,并結合范式簡要說明設計思路。
簡評:
這道題也與百度的業務有關,百度現在除了搜索外,還有貼吧,知道,博客等重要產品。
同時也在積極的探索社區化,包括前不久宣布進軍電子商務領域,搜索之外的這些產品,
其主要功能的實現主要是對數據庫的操作。
因此,想進入百度,也需要對數據庫有一定的認識。
? 實現思路及數據庫設計:
1,該論壇主要有兩個實體對象,用戶和帖子;對于帖子對象,有一個問題:回復的帖子是否應該跟主題帖子存放在同一個表里?
考慮到每天更新10萬帖子,說明帖子數比較多,為了方便主題的呈現,我一般都把主題貼和回帖分別放在不同的表中,把主題貼和回帖分開可以提高查詢效率(300萬的訪問量每天)。
2,按照1中的思路,該論壇由兩個對象(用戶和帖子)變成三個實體對象,分別是用戶,主題帖子,回復帖子;
3,上述三個對象存在三個關系,分別是:
用戶--主題帖,一個用戶可以發0個或多個帖子,一個帖子對應一個用戶(一對多關系),
主題帖--回復帖:一個主題有0個或多個回復帖子,一個回復帖子對應一個主題(一對多關系);
用戶--回復貼:一個用戶可以回0個或多個帖,一個帖子對應一個用戶(一對多關系)。
還存在對回復貼的回復,這個考慮用fatherId來表示。
4,由于三個關系 “用戶--主題帖,主題帖--回復帖,用戶--回復貼” 都是一對多關系,根據表設計一般原則,可以將這兩個關系獨立建立表,也可以不另外建表而將一對多的關系體現在實體表中;然而,表間的連接查詢是非常耗資源的,所以應盡量減少表間連接,那么對三個關系不應該分別建表,而是把用戶的id作為主題表和回帖表的外鍵,把主題貼id作為回帖表的外鍵。
5,鑒于以上考慮,該論壇的三個表如下所示
表名:t_user_info (用戶信息表)
?
字段名?類型?缺省值?中文含義?約束?備注?
?id?Int?用戶編號?PRI?Auto_increment
?Name?Varchar(30)?用戶名??
?Email?Varchar(50)??
?Phone?Varchar(30) ???
?Addr?Varchar(200)??
其他字段略,根據需要添加
表名:main_content_info (主題帖信息表)
字段名?類型?缺省值?中文含義?約束?備注
?id?Int?貼編號?PRI?Auto_increment
?Title?Varchar(200)?發帖標題??
?Content?Text?發帖內容??
?UserID??Int?用戶編號?外鍵
其他字段略,根據需要添加
?
?表名:sub_content_info (回復貼信息表)
?字段名?類型?缺省值?中文含義?約束?備注?
?id?Int?貼編號?PRI?Auto_increment
?Title?Varchar(200)?發帖標題??
?Content?Text?發帖內容??
?UserID?Int?用戶編號?外鍵
?FatherID?Int?父編號??
?MainID?Int?主題帖編號?外鍵
其他字段略,根據需要添加
6,符合范式分析:
上述表中每個字段不可再分,首先滿足1NF;
然后數據庫表中的每個實例或行都是可以被惟一地區分(id),不存在部分依賴,因此滿足2NF;
t_user_info (用戶信息表)和main_content_info (主題帖信息表)不存在任何傳遞依賴,至少屬于BCNF;
但是sub_content_info (回復貼信息表)不滿足3NF,因為存在如下傳遞依賴:id-->FatherID,FatherID-->MainID。
范式并不是越高越好,sub_content_info表只滿足2NF卻更有效率,也是當今論壇較主流的設計。在如下傳遞依賴:id-->FatherID,FatherID-->MainID。
范式并不是越高越好,sub_content_info表只滿足2NF卻更有效率,也是當今論壇較主流的設計。
總結
以上是生活随笔為你收集整理的百度笔试题--论坛数据库表设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu使用代理服务器上网
- 下一篇: 招行两地一卡——PayPal美元兑换人民