简单的资金转移和规范化的数据库设计

时间:2017-07-23 18:11:05

标签: postgresql database-design

假设我有一个典型的应用程序,用户可以转移一些虚拟货币。所以我可能会有像

这样的东西
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

但这些天它是最好的解决方案吗?可以通过观点或其他方式更好地完成吗?我真的觉得我不应该有非标准化的数据。

P.S。如果重要的话,我正在使用PostgreSQL。

感谢。

1 个答案:

答案 0 :(得分:1)

规范化不会解决聚合数据,您的用户表不会违反任何正常形式。

观点是否会更好是值得商榷的。允许传输表中的空值会影响数据的有效性。您可以将balance列视为简单缓存,只要您可以保持其有效,它可以归结为视图与触发器的复杂性和性能。触发器可以执行其他工作,例如检查用户是否有足够的资金,平衡栏是方便的。您可以将触发器与视图组合在一起,而无需使用平衡列。就个人而言,我认为平衡栏加触发器可以实现简单有效的设计。