gpt4 book ai didi

mysql - 使用多种支付方式设计支付数据库的更好方法

转载 作者:行者123 更新时间:2023-11-30 21:28:36 24 4
gpt4 key购买 nike

我正在尝试为一个假冒的在线商店制作一个支付/交易数据库(只是想学习)。 1笔付款可以购买1到多件商品。 1笔付款只能有1种付款方式。

为简化示例,有 2 种付款方式,PayPal 和比特币。每种付款方式都有不同的属性,因此它们必须是不同的表。

我有我的付款表,它告诉我什么交易购买了什么元素。但是,您可以看到,如果 paypal_id 为 NULL,则 bitcoin_id 列不是。这意味着有很多 NULL,我认为这不是一个好的设计。在这种情况下,我怎样才能有好的设计?


Paypal 表

paypal_id | txn_id           | buyer_email    | amount
1 | 3sd7fgudf23sdf34 | john@mail.com | 50.00
2 | 45shfik45345fg2s | mike@gmail.com | 100.00

比特币表

bitcoin_id | txn_id                     | amount
1 | 34327yhujndreygdiusfsdf324 | 0.19203
2 | sdfgurjibdsfhubhsdfinjo332 | 0.04123

项目表

item_id | item name | price
1 | ball | 50.00
2 | shirt | 50.00

付款

payment_id | item_id | paypal_id | bitcoin_id
1 | 1 | 1 | NULL
2 | 1 | 2 | NULL
3 | 2 | 2 | NULL
4 | 1 | NULL | 1
5 | 1 | NULL | 1
6 | 1 | NULL | 2

最佳答案

你的设计很好。但是您可能想考虑一个替代方案,您有一个 payment_transactions 表,然后是使用相同主键的相关表:

create table payment_transactions (
payments_transactions_id int auto_increment primary key,
type varchar(255),
payment_datetime datetime, -- probably common to all payment methods
. . . other columns if you like,
unique (type, payments_transactions_id) -- this will be used for foreign key references
);

create table bitcoin_payments (
bitcoin_payments_transaction_id int primary key,
type varchar(255) generated always as ('bitcoin'),
. . . , -- columns specific to bitcoins
foreign key (type, bitcoin_payments_transaction_id) references payments (type, payments_transactions_id)
);

-- similar for paypal

然后您的付款表可以有一个付款外键。

这处理了大部分数据建模问题;

  • 您已正确声明外键关系。
  • 无论类型有多少,payments 只需要一列。
  • 您可以轻松引入新类型。
  • 这保证每次付款一种类型(通过在外键引用中包含 type)。

一个缺点是您需要将每个事务插入两次。首先进入 payment_transactions 表,然后进入适当的表。

付款实际上比您介绍的要复杂。一个更现实的数据模型将处理:

  • 交易状态。
  • 重试。
  • 部分付款。

了解基本结构后,您可能想尝试添加新功能。

关于mysql - 使用多种支付方式设计支付数据库的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57510457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com