有3个表 user 用户表 article 文章表 reward 打赏表 打赏表记录打赏的记录,打赏分两个类型,可以打赏用户,也可以打赏文章。 打赏表的数据结构有两种设计方式如下: A:
//类型
// 1:打赏用户
// 2:打赏文章
type:{
type:String,
index:true,
},
//来源 ID
// type 是1 时值指向 user 表
// type 是 2 时值指向 article 表
source:{
type:Schema.Types.ObjectId,
index:true,
},
//打赏次数
num:{
type:Number,
},
//打赏金额
money:{
type:Number,
}
B:
//类型
// 1:打赏用户
// 2:打赏文章
type:{
type:String,
index:true,
},
//用户ID
user_id:{
type:Schema.Types.ObjectId,
index:true,
},
//文章ID
article_id:{
type:Schema.Types.ObjectId,
index:true,
},
//打赏次数
num:{
type:Number,
},
//打赏金额
money:{
type:Number,
}
想请教下,哪个方案更合理些,或者还有别的方案,谢谢。
按你的描述,第一种就可以啊,分开来意义在哪?
@captainblue2013 第一种如果使用 $lookup 联表时,会有问题,source 字段应该联哪个表呢?要先指定 type 才可以,所以这个有局限。
但是如果用第二种,就会多出字段来,算是增加了冗余吧?不知道该怎么平衡。
@285858315 我有两个问题 第一、如果是第一种方案,你的用户编号不能与文章编号重复,否则就失去合在一起的意义。合在一起的意义是从用户、文章找打赏时可以少做一次来源判断。 第二、如果使用第二种方案,我认为来type使用去意义,两个字段中可以使用空来区分来源。
我不太懂nosql技术,我用sql的角度来考虑这个问题得出的结论是: 第一种方案没有主键,第二种方案是组合主键。
根据建模三大范式,我的建议是这样的: id:主键 sourceid:用户编号、文章编号 type:来源
说得不对,请指教
对,那就第二种 自豪地采用 CNodeJS ionic
第一种方案会更好一点,无论是rdbms还是nosql都很好
个人赞同第一种方案
@i5ting 第一种联表会不会有问题,必需要先确定 type 才能联表吧?要不然 source 不知道联哪个表吧?