【问题标题】:Currency SQL data structure [closed]货币 SQL 数据结构 [关闭]
【发布时间】:2015-07-14 22:27:26
【问题描述】:

我想在我一直致力于的自定义论坛上开发货币系统,但我不知道最好的方法。

我应该在我的用户表中添加一个新的“黄金”字段并使用 sql 语句递增吗?

id, user, pass, created_at, gold

逻辑:用户创建新的论坛帖子;更新用户表:gold + 1

我是否应该添加一个记录所有内容的事务表并执行count where user = x

id, user_id, amount
 1        3       1 (new forum post)
 2        3       1 (new forum post)
 3       12      -5 (item purchase)
 4        3      -1 (deleted post)
 5        9       1 (new forum post)

或者有更好的方法吗?

【问题讨论】:

  • 货币系统到底是干什么用的?就像我根据您的示例假设的声誉一样?如果磁盘空间不是问题,我建议记录每个事务,以便您记录所有内容。当您无法解决其帐户的声誉/黄金/经验/等问题时,用户可能会变得挑剔。
  • 嗯,有一个叫做Database Normalization的东西。部分原因意味着您不应该在表上创建大量的列。但这也取决于您要保存的数据类型以及您将来将如何处理这些数据。你打算有额外的收入天吗?金币活动?在这种情况下,最好使用事务表。但如果不是,它真的只是黄金,用户表中的一列就可以了。
  • 我想在某种程度上它类似于声誉。这个想法是每次用户添加评论时将“黄金”增加 X 数量。如果我有数千行,count() 是否会变得低效?
  • 除了上面的 cmets,你可以同时做这两个 - 事务日志将显示总数是如何确定的,并且用户表将具有当前的效率平衡。但是数据库的黄金法则之一是不要将相同的数据存储两次。例如,可能存在性能至关重要的例外情况,但除非必要,否则应避免使用。所以,如果你只有一个,保留日志会更好(假设信息实际上是有用的)。如果user_id 上有索引,那么select sum(amount) from table2 where user_id = 1 应该是相当有效的。

标签: php mysql sql laravel currency


【解决方案1】:

这在很大程度上取决于您想用它做什么以及您喜欢哪种编程方式。

用一些事实来处理它:

  • 我希望论坛很快。为此,您应该只使用简单的Select。像SUM() 这样的函数需要更多的时间来执行。在一个很可能不会成为问题的小型系统中,但 mysql-db 通常可扩展性很差,因此您应该从一开始就牢记这一点。

  • 您肯定想要一种跟踪交易的方法。主要是为了能够检查实际发生的情况。即使您建立了一个出色的系统来处理您的黄金,您仍然希望不时跟踪发生的事情。因此,存储交易更方便。

  • 冗余数据和事务同步可能是个问题。每个事务系统都有保持一切同步的问题。使用 MySQL 并没有那么困难,因为可以在执行事务时锁定表。但是冗余数据更让人头疼。您必须确保在所有地方同时更改数据,以免其他操作干扰。

在基本系统上,我会将数据存储在用户表中,并将所有事务作为日志保存在另一个表中。但永远不要将其用于向用户输出。是否进一步取决于您的系统需要什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 2021-03-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多