Language agnostic 什么是可维持的储蓄方式;星级评定“;在数据库中?

Language agnostic 什么是可维持的储蓄方式;星级评定“;在数据库中?,language-agnostic,database-design,Language Agnostic,Database Design,我将使用jQuery插件向用户展示一个漂亮的界面 要求显示5颗星,总分最高为10分(每颗星2分)。 现在我考虑使用7/10作为该值的格式,但是如果将来某个时候我会收到这样的请求呢 我们想给用户更多的选择,让我们把总分提高到20分(这样每个明星最多贡献4分) 最后,我将为“星级”列提供一个混合值的表:一些类似于7/10,而另一些类似于14/20 您可以在数据库中使用这种差异,并在逻辑层中处理它以使其保持一致吗?或者是首选的另一种方式,以便查询表不会在应用程序之外导致不一致的结果? 也许浮点值可以帮

我将使用jQuery插件向用户展示一个漂亮的界面

要求显示5颗星,总分最高为10分(每颗星2分)。
现在我考虑使用
7/10
作为该值的格式,但是如果将来某个时候我会收到这样的请求呢

我们想给用户更多的选择,让我们把总分提高到20分(这样每个明星最多贡献4分)

最后,我将为“星级”列提供一个混合值的表:一些类似于
7/10
,而另一些类似于
14/20

您可以在数据库中使用这种差异,并在逻辑层中处理它以使其保持一致吗?或者是首选的另一种方式,以便查询表不会在应用程序之外导致不一致的结果?
也许浮点值可以帮助我,将该值存储为小于或等于1的数字是否更好?因此,在这两个示例中,存储在数据库中的结果值将是
0,7
,作为一个数字,而不是一个varchar,也可以在应用程序外部查询。


你觉得怎么样?

我会使用两列:一列用来保存评级,另一列用来保存最高评级。因为这个最大值将来可能会改变,所以我会将它与其他数据一起保存在同一行中。您可以使用短整数,这样即使行数很大,所需的空间也非常小。

有三个选项:

  • 将值存储为一个分数(老实说,这是我可能会使用的分数,因为它是最低的维护)
  • 将值存储在两列中,一列用于额定值,另一列用于最大值
  • 将值存储为具有假定最大值的单列,然后在最大值更改时更新所有值
  • 第一个选项是最可移植的,因为最大值和评级表示完全是客户端的(就数据库而言是客户端的,而不是在用户机器上完成的客户端)

    第二个似乎是任意复杂的,除非你想继续显示7/10评级为7加10星,而不是14加20星

    第三种方法需要最少的前期工作,但在评级等级发生变化时需要大量的数据库更新


    重申一下,我建议在数据库中将该值存储为
    float
    double
    ,并在客户端应用适当的刻度。

    我建议将您的分数存储为简单整数-如果评分为7/10,则将“7”存储在db中。如果需要将其更改为20分scale,只需运行一个更新查询,将所有现有数字翻倍。如果需要更高的精度,可以使用浮点数,但对于大多数评级系统,整数应该可以。我会将其存储为一个简单的整数,以100为单位。这样,您就有足够的粒度,以备将来需要提高评级的精度。否也需要更改任何现有的存储值。


    只需存储点数并使用应用程序逻辑在IU中的星号中表示即可。

    如果将来需求发生变化,您将调整逻辑,并在需要时运行转换脚本。仅此而已。

    我喜欢浮动的想法,但没有一个选项非常突出。我只是建议,无论您选择何种机制,请确保列的名称正确

    浮动选项应该类似于
    star\u rating\u ratio
    。简单整数应该是
    star\u points\u out\u of十
    。百分制可以是
    star\u rating\u percent


    (我以前见过列名上写着“百分比”,但数据是一个简单的比率。这让我晚上睡不着觉!)

    为什么要引入一个人工刻度(100),而你只需要将数值存储为一个
    浮点值
    ?用户通常会说“这是10分之7”,这只是说“它是70%”的一种奇特的方式。将数据存储为百分比是一个逻辑解决方案,因为百分比永远不会改变。为什么不使用一个漂亮的整数,如256?:)Kiss在搜索解决方案时总是会从我身边溜走,谢谢。我认为这是最好的选择,只需将其存储为
    tinyint
    1..5。如果将来需求发生变化,则需要五分钟的脚本来将所有现有数据更新到新的规模。如果需求没有改变(这可能更大),那么您就不会浪费时间来实现一些毫无益处的东西。此外,如果需求发生变化,它们不太可能以您期望的方式发生变化;)在可能的情况下,数据应表达其含义。虽然这比将值存储为浮点更容易(稍微容易),但它的表现力较差。值.5很清楚,它表示“5/10”或“10/20”或任何刻度,因为用户永远无法显式输入.5。由于“5”是一个有效的用户评级,因此“5”的值并不像5/10、5/20或5/45那样具有表现力。如果处理浮点数比较困难,我同意……但事实并非如此。我建议简单地命名整数值
    ,并在评论中给出更多细节。如果系统更改为(比如说)20个点中的点,并且在UI中不使用星号,则类似于“星号”的名称将变得不好。@z-boss-如果列的解释更改,那么它的名称也应该更改。“但是,每一个使用该栏的地方也必须改变!”是的。这正是重点。破坏性的改变应该早一点破坏,而不是晚一点破坏。对于解释得很好的答案+1,但我想我会按照z-boss的建议去做。在我的场景中,这是最简单的事情,将来可能的转换不会花那么多时间。