【问题标题】:Store multiple ratings in a single table row将多个评级存储在单个表行中
【发布时间】:2013-03-06 05:34:29
【问题描述】:

如何在不重复存储评级的行的情况下存储多个评级

create table pic_table
(user_id varchar2(10) not null,
 pic_id number not null,
 pic_snap bfile,
 rating number,
 constraint snp_pk primary key (pic_id));

insert into pic_table
values(u1,p1, bfilename('GIF_FILES', 'PIC_1'),'JPEG');

User1 上传一张图片,它可以被评为 1,2 或 3。然后 user2 将图片评为 2,u3 将图片评为 3。记录每个评分是否需要 3 列,我是否需要 3 行来记录每个用户对图片的评分,即

user_id pic_id  vote_1  vote_2   vote_3
u1      pic_1           u2       u3

如果用户评分超过 2 个,即 user4 评分为 2,user5 评分为 3,该怎么办。如何存储这些数据并计算汇总?

user_id pic_id    v_1   v_2 v_3
u1          pic_1       u2  u3
u1          pic_1       u4  u5

这将占用大量空间。我可以使用记录以数组的形式存储值并通过从集合中提取结果来计算聚合吗?

【问题讨论】:

    标签: database database-design architecture


    【解决方案1】:

    使用以下字段创建一个表“评分”:

    user_id (int)
    pic_id (int)
    rating (int)
    

    我建议将 user_id 和 pic_id 设置为组合主键。

    在这张表上做所有的计算,你应该没有空间问题..

    【讨论】:

    • 谢谢。这张表仍然需要保存用户对 pic_id 给出的不同评级,即如果 10 个用户对一张图片进行评级,那么这意味着 10 行!这些列将只是 user_id,pic_id,rating (u1,p1,1;u2,p1,2;u3,p1,3;u4,p1,1)。如果20张图片被评分,那么就意味着200行来存储评分,难道没有有效的解决方案吗?
    • 是的,但由于此表仅包含整数,因此文件大小不会有问题。使用存储数组或添加多个列来重写它会增加复杂性,增加更多开销并且从长远来看会降低动态性。
    • 也许其他用户可以提供替代方案,但在我看来这是最好的解决方案!
    • 奥利,非常感谢。非常感谢您的帮助。如果其他用户可以建议任何替代方案来更有效地存储多个评分,请分享。
    • 如果您的存储空间非常紧张,那么您可以将评级设为 char(1),这可能比 int 占用更少的空间,具体取决于您的 RDBMS 存储数据的方式。请查阅您的数据库调优手册。
    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 2012-09-04
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多