假设我有一个典型的应用程序,用户可以转移一些虚拟货币。所以我可能会有像
这样的东西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。
感谢。
答案 0 :(得分:1)
规范化不会解决聚合数据,您的用户表不会违反任何正常形式。
观点是否会更好是值得商榷的。允许传输表中的空值会影响数据的有效性。您可以将balance列视为简单缓存,只要您可以保持其有效,它可以归结为视图与触发器的复杂性和性能。触发器可以执行其他工作,例如检查用户是否有足够的资金,平衡栏是方便的。您可以将触发器与视图组合在一起,而无需使用平衡列。就个人而言,我认为平衡栏加触发器可以实现简单有效的设计。