【问题标题】:MySQL 5-star rating datatype?MySQL 5 星评级数据类型?
【发布时间】:2010-01-12 14:02:13
【问题描述】:

对于必须在 1 到 5 之间的产品评级,ENUM('1','2','3','4','5') 是否是合理的数据类型?

谢谢!

【问题讨论】:

    标签: mysql enums rating


    【解决方案1】:

    是的,这将是一种合适的数据类型,因为它强制执行您的域。

    但是,如果您要将它们相加(或进行任何其他数学运算),数字数据类型可能会更好。

    【讨论】:

    • 确实如此,或者如果您打算平均它们。 TINYINT 可能更合适,只要确保在应用程序中限制值即可。
    • 啊,好点谢谢!因此,例如,如果我想计算产品枚举的平均评分将是一个糟糕的选择,对吧?我应该只使用一个 int 并以编程方式将输入限制在 1 和 5 之间>
    • @Jordan,我的想法完全正确。如果你有一个固定的文本列表,ENUM 真的很闪耀,并且没有数字内涵
    • @Danny King - 是的,当然。星星是一种表现形式。但就数据而言,您实际上是在“计数开始”。所以整数类型是完全合适的。
    【解决方案2】:

    我建议使用

    TINYINT UNSIGNED NOT NULL
    

    或者,为了更好的 ANSI/SQL 兼容性,使用:

    SMALLINT NOT NULL
    

    使用整数类型,更容易进行计算。 ENUM 还不错,但有可能会搞砸,因为它是一种双字符串/整数类型(在封面下,它是一个 int,但从外面看,它是一个字符串)。事实上,假设你确实觉得有必要去 3 星或 10 星左右,迁移的痛苦会小得多。

    【讨论】:

      【解决方案3】:

      如果您使用的是 Mysql 8+,那么您使用 TINYINTCHECK 约束

      -- Product reviews
      CREATE TABLE product_review (
        product_review_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
        user_id INT UNSIGNED NOT NULL,
        product_id INT UNSIGNED NOT NULL,
        unique(user_id, product_id),
        rating TINYINT UNSIGNED NOT NULL CHECK (
          rating > 0
          AND rating <= 5
        ),
        review VARCHAR(2047) NOT NULL,
        created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
       -- FOREIGN KEY (product_id) REFERENCES product (product_id) ON DELETE CASCADE ON UPDATE CASCADE.
         -- FOREIGN KEY (user_id) REFERENCES user (user_id) ON DELETE CASCADE ON UPDATE CASCADE
      );
      
      
      

      它不允许除 1、2、3、4、5 以外的值,还支持任何类型的数学运算,例如您可以通过简单的计算获得产品的平均评分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-23
        • 1970-01-01
        • 1970-01-01
        • 2020-04-22
        • 1970-01-01
        • 2016-06-21
        • 2013-06-04
        • 2020-03-31
        相关资源
        最近更新 更多