我并不是真正的数据库专家,因此,我希望就以下建议的数据库结构提供一些反馈。情况如下;我正在构建一个Web应用程序,访客可以在其中以某种货币下达汇票,并以另一种货币接收等值的货币。管理资金的钱包不是数据库结构的一部分,它们通过在本地网络上运行的API进行通信。我需要在数据库中管理的唯一一件事就是订单及其相关的金额。这里有几件事:
到目前为止我想出的数据库结构:
订单表+-------------------+------------+-----------+---------------------+---------------------+
| id | rate | status | created_at | updated_at |
+-------------------+------------+-----------+---------------------+---------------------+
| 8ec17086-0d34-... | 0.00024041 | "expired" | 2019-12-06 20:11:30 | 2019-12-06 20:26:30 |
| 4fcaf220-c3af-... | 0.00026243 | "new" | 2019-13-06 15:01:50 | 2019-13-06 15:01:50 |
| ... | ... | ... | ... | ... |
金额表
+-----+--------+------------+-------------------+
| id | value | wallet | order_id |
+-----+--------+------------+-------------------+
| 1 | 150000 | "wallet_2" | 8ec17086-0d34-... |
| 2 | 100000 | "wallet_1" | 4fcaf220-c3af-... |
| 3 | 200000 | "wallet_3" | 4fcaf220-c3af-... |
| ... | ... | ... | ... |
计算/跟踪未结订单金额的总和的方式我仍然不确定,基本上是我希望听到一些不同的事情。我自己已经考虑过以下选项:
每次收到新的汇票请求时,都会动态计算每个钱包的运行总和。类似这样:
SELECT SUM("amount"."value") AS "sum" FROM "amount" "amount" INNER JOIN "order" "order" ON "order"."id"="amount"."orderId" AND ("order"."status" IN ("new", "pending", "accepted")) WHERE "amount"."wallet" = "wallet_1"
专业人士:
骗子
在 amount 表中添加一个额外的 balance 列,该表用于存储累积金额。每次我想了解订单余额时,我都只查找与未完成订单相关的最新订单金额。因此, amount 表如下所示:
+-----+--------+---------+------------+-------------------+
| id | value | balance | wallet | order_id |
+-----+--------+---------+------------+-------------------+
| 1 | 150000 | 150000 | "wallet_2" | 8ec17086-0d34-... |
| 2 | 100000 | 250000 | "wallet_1" | 4fcaf220-c3af-... |
| 3 | 200000 | 450000 | "wallet_3" | 4fcaf220-c3af-... |
| ... | ... | ... | ... | ... |
专业人士:
骗局:
添加一个新表,该表的行和列与记录每个钱包的订单金额总和的钱包一样多。每次创建订单时,对应的列都需要增加订单金额,每次订单完成,到期或以其他任何方式从未完成状态转换为未完成状态时,相关列都会减少相关订单金额代替。我猜这也可能是多行(每个钱包单独一行)和单列表。考虑一下,这样做会更有意义,因为在添加/删除钱包时会更加灵活。
专业人士:
骗局:
我试图尽可能简洁地描述这种情况。抱歉,其中有些冗长或不清楚。仍然希望有人能够充分理解它以提供一些建议。当然,将不胜感激。就个人而言,我在选项1和3之间划分,稍微偏向选项3。