先说一下我的情况吧,我做的数据库中有个留言表,所有用户的留言都在这个表中,现在要让用户每次登录都看到有多少条新留言,只显示多少条就行。但是留言表中没有标识新留言的字段(已有19个字段),我的解决方法是又加了一个表A,这表只有两个字段:用户Id和新留言数new。如果有人给用户P留言,插入留言表一条记录,A表中P用户的new就加一。然后,此用户登录后看到多少新留言后,就清空P用户的new。
后来老总找来个很有经验的人来检查我的数据库,说这样不行,应该添加字段用来标识新留言。我感觉那样不好,因为留言表记录有很多,可能上百万记录,这样的话用count是不是很慢,而且count之后还要把这字段update为已读。如果用户很长时间没上线,有很多新留言,如果超过200条,就要表死锁(这是我刚上网查的)。
我是一个学生没啥经验,我还是觉得我的办法没问题。但是老总一定要让我按那个有经验的人说的做。
大家帮忙看看我该怎么做最好。
这是我第一次博问呀,希望有点收获。
楼主的方法是正确的,如果只是想显示数量,楼主的方法效率是比较高的。
用count 统计确实会有性能问题。那位有经验的人说要加字段,你请他说出理由,你看看他主要是考虑哪方面。
似乎要加标示才行,要不然你就显示一个新的留言数,他只看了这个数字,但他实际还没有看留言,你就把新的留言当成已读?似乎不太合理吧。
你自考虑了条数问题,真正的核心在于这条留言是否已经被客户阅读过了!
你只看到其中一面,但忽略了另一面。
你所说的也是必要的,为了提高性能,在数据多的情况下,实在是不宜实时的去计算数量,所以在用户发送新留言的时候,就把数据加1,在这一点上,你的设计思路,没有问题。
而你们老总说的,也是必要的,不然像一楼跟二楼说的,你怎么去标记已阅读呢?
所以,你应该把你的思路跟你老板的思路结合,当一个用户标记已阅读时,把你的那个数据减一,新发留言时,把数据加一,这样就可以满足需求了。
该起义时就起义,起义不了就枉义!
该起义时就起义,起义不了就枉义!顶顶顶!!!
不要反,要多沟通
-------------------------
回头又看了看你写的,问题不是很大,那位仁兄说得有理,未读信息应该用一个字段来表示,因为只有两个状态,就用bit型就够了。
对于将未读设置为已读的操作,快慢取决于你的业务逻辑和操作方式,按理说应该是看一条标记一条,这样的话update只操作一条数据,你可以使用主键做为查询条件,即使千万级数据也是很快的。
如果非要用用户名之类的话,可以在搜索字段上加一个索引,百万的话也没有太大问题。
如果用户数据上到千万以上,考虑表分区,就是这样。