【问题标题】:Database design for simple money transfers and normalization用于简单汇款和规范化的数据库设计
【发布时间】:2017-07-24 13:51:50
【问题描述】:

假设我有一个典型的应用程序,用户可以在其中转移一些虚拟货币。所以我可能会有类似的东西

CREATE TABLE users(
  id serial NOT NULL PRIMARY KEY,
  balance money NOT NULL DEFAULT 0
);
CREATE TABLE transfers(
  user_from integer NOT NULL REFERENCES users (id),
  user_to integer NOT NULL REFERENCES users (id),
  amount money NOT NULL
);

然后我只需将AFTER INSERT 触发器添加到transfers 表中,因此它将在每次传输时更新balance。

但这是当今最好的解决方案吗?可以用视图或其他东西做得更好吗?我真的觉得我应该有非规范化数据时不是这种情况。

附:如果重要的话,我正在使用 PostgreSQL。

谢谢。

【问题讨论】:

  • 您的transfers 表缺少主键。除此之外,您指的是哪些非标准化数据?
  • 余额可以从转帐表的金额总和中计算出来。所以我正在考虑计算它并以某种方式缓存的视图,这个缓存应该在传输更新时为单独的行刷新。
  • 规范化不处理聚合数据,您的users 表不违反任何规范形式。
  • 但还是这样。我可以通过视图和缓存以某种方式实现结果吗?它会以任何方式变得更好吗?
  • 您将如何处理期初余额?

标签: postgresql database-design


【解决方案1】:

规范化不处理聚合数据,您的用户表不违反任何规范形式。

视图是否会更好是值得商榷的。在传输表中允许空值会影响数据的有效性。您可以将 balance 列视为一个简单的缓存,前提是您可以保持它有效,它归结为视图与触发器的复杂性和性能。触发器可以做额外的工作,例如检查用户是否有足够的资金,余额栏会很方便。您可以将触发器与视图结合起来,在没有余额列的情况下执行相同的操作。就我个人而言,我认为平衡列加上触发器可以实现简单有效的设计。

【讨论】:

    猜你喜欢
    • 2011-07-25
    • 2011-11-20
    • 1970-01-01
    • 2013-01-18
    • 2012-08-10
    • 2023-03-31
    • 1970-01-01
    • 2011-04-18
    • 2011-03-03
    相关资源
    最近更新 更多