日期:2014-05-16  浏览次数:20804 次

如何设计这个数据库?
事情经过

一位帅哥(id为1)送了999朵玫瑰花给一位美女(id为2)

数据记录在history_logs1表中
history_logs1表如下

user_id  friend_id  event_id  date_event      number
2     1      10     2010-02-14 10:37:21  999

event_id=10表示送玫瑰花

这位帅哥又邀请这位美女一起去看电影

数据记录在history_logs2表中
history_logs2表如下

user_id  friend_id  event_id  date_event
2     1      11     2010-02-14 20:30:05

event_id=11表示邀请您一起去看电影

美女来了以后,系统要将帅哥的两条消息按照时间排序以下面的形式展现给美女

[2010-02-14 10:37:21]您的好友[帅哥]送给您[999]朵玫瑰花
[2010-02-14 20:30:05]您的好友[帅哥]邀请您一起去看电影

[]中的数据从数据库中读取,其他描述性文字都是预先根据event_id设定好的

1,请问SQL语句应该怎么写?
2,另一种设计方案是将所有消息都储存在history_logs1表中,但是类似邀请去看电影的消息就会有number这个字段是冗余的,这个表储存着1000W条以上的记录
3,这样设计数据库是否合理?如果有好的方案,请指教

------解决方案--------------------
为什么不放在一个表中?

user_id  friend_id  event_id  date_event      number
2     1      10     2010-02-14 10:37:21  999
2     1      11     2010-02-14 20:30:05  null
------解决方案--------------------
SELECT * FROM (
SELECT * FROM history_logs1
UNION
SELECT * FROM history_logs2) AS V
WHERE V.user_id=#####
------解决方案--------------------
我同意1楼的方案。放在一个表中比较恰当。 在数据库设计时,有适当的冗余是完全可以的。如果在数据库设计中要完全避免冗余,那么设计出来的数据库是不怎么样的。
其实我们在设计数据库的时候,并不需要100%避免冗余,或者必须要遵守范式的要求。只要设计出来的数据库可以使性能增加或者更加的合理,并不需要循规蹈矩的去按资料的办法去做。
有句话说的好,适当的冗余可以使数据库设计得更加合理。