请教一个数据结构的问题
发布于 8 年前 作者 285858315 3246 次浏览 来自 问答

有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,
    }

想请教下,哪个方案更合理些,或者还有别的方案,谢谢。

8 回复

按你的描述,第一种就可以啊,分开来意义在哪?

@captainblue2013 第一种如果使用 $lookup 联表时,会有问题,source 字段应该联哪个表呢?要先指定 type 才可以,所以这个有局限。

但是如果用第二种,就会多出字段来,算是增加了冗余吧?不知道该怎么平衡。

@285858315 我有两个问题 第一、如果是第一种方案,你的用户编号不能与文章编号重复,否则就失去合在一起的意义。合在一起的意义是从用户、文章找打赏时可以少做一次来源判断。 第二、如果使用第二种方案,我认为来type使用去意义,两个字段中可以使用空来区分来源。

我不太懂nosql技术,我用sql的角度来考虑这个问题得出的结论是: 第一种方案没有主键,第二种方案是组合主键。

根据建模三大范式,我的建议是这样的: id:主键 sourceid:用户编号、文章编号 type:来源

说得不对,请指教

对,那就第二种 自豪地采用 CNodeJS ionic

第一种方案会更好一点,无论是rdbms还是nosql都很好

个人赞同第一种方案

@i5ting 第一种联表会不会有问题,必需要先确定 type 才能联表吧?要不然 source 不知道联哪个表吧?

回到顶部