要不要做冗余字段?

冗余是为了避免join, 但避免join未必要一定冗余。你可以先把A关联的b_id查出来,然后再去B表里查一次。 那么什么情况下应该选择冗余,什么情况下选择查询两次呢?除了要看数据会不会更新,还有一些考虑因素:(大前提是不作join) 1. 如果只需要看A的单行记录,及这行记录对应的B记录,使用两次查询就够了 2. 如果需要查看A的列表,及对应的B记录,那就可以考虑把B记录冗余到A表,也可以不冗余。不冗余的话,就要收集A列表中所有的b_id,然后批量地去B表中执行in查询,稍微有点麻烦 3. 如果需要根据B表中的字段查询A记录,并带出相关的B记录,那就只能用冗余了。为了帮助理解,举个例子:在一个论坛系统的数据库中,找出这样一些“回复”记录,这些回复对应的主贴的作者以"k"开头且回复发表于三天之内,结果中除了要显示“回复”记录,还要显示主贴的作者。 如果“回复”表里没有冗余“主贴作者”字段,这个问题就无解。

mongodb + spring data一起使用时,bean的id应该用什么类型?

mongodb + spring data一起使用时,bean的id应该用什么类型? 在插入bean时我不会设置id的值,而是让mongodb/spring data把生成的_id塞进来。 用原子类型long, int 会有问题;不设置值时,值就是0, mongodb会认为你传的_id值为0. 第一条记录以_id=0插入成功后,插入第二条_id=0的记录时,系统会报键重复的异常。 用Long, Integer行不行? 也不行,因为Spring Data没有内置这样的转换。 正确答案是:String或BigInteger, Spring Data默认只支持这两种类型。参见:ObjectIdToBigIntegerConverter 和 ObjectIdToStringConverter .  或者你可以自定义一个converter, 但我没有去验证。

mongodb出的nosql数据库选型方案

http://www.mongodb.com/lp/whitepaper/nosql-considerations 有自吹的嫌疑,但仍然很有参考价值 ========== 摘抄一段使用nosql的三个动机: (1)In some cases the motivation is technical — such as a need to scale or perform beyond the capabilities of their existing systems — (2)while in other cases companies are driven by the desire to identify viable alternatives to expensive proprietary software. (3)A third motivation is agility or speed of development, …

mongodb出的nosql数据库选型方案 Read More »

代码片断: sql + java实现数据库某字段的原子递增

“update t set v = v + 1 where id = 1”  这个语句可以用于数据库某字段值的递增,但在并发情况下,它很容易造成”丢失修改“。要解决这个问题,一般要用乐观锁。 下面是我最近在项目中使用的做法: –使用cas风格 update t set v = #newValue# where id = 1 and v = #currentValue# //乐观锁+重试机制,如果重试了一定次数还未成功,则抛出 IllegalStateException public void increaseValue(long id) throws IllegalStateException { //如果cas失败,则继续执行,直到100遍 for (int i = 0; i < 100; i++) { int currentValue = getValueById(id, topicName); if …

代码片断: sql + java实现数据库某字段的原子递增 Read More »

压力测试中几种不同的”压力“

1. 请求的数据量大小(字节数) 2. 每秒请求数    a. 短连接应用:不必多说    b. 长连接应用:大量连接建立请求 3. 在线数    a. 短连接应用:Session数    b. 长连接应用:维持的长连接数(socket数) 4. 留存数据量: 数据库里已有的数据量 待续。。。