在接下来的几节课中,我将构建一个后端系统的扩展示例。该系统将支持在线拍卖市场。
在第一讲中,我将描述系统的数据库结构,并为系统设置一些基本的业务规则。
本讲座假设您了解关系数据库和SQL的基础知识。因为我们在CMSC 250中涵盖了这些材料,所以我不会在本课程中涵盖基础知识。如果您觉得需要对SQL基础知识进行复习,可以在https://www.w3schools.com/sql/上找到一个非常好的SQL入门教程。
我们将介绍的前三个表存储有关用户的基本信息。
users表存储了赢博体育系统用户的用户id、用户名和密码。
我将使用一种基于通用唯一标识符(uuid)的更安全的系统来代替用户通常使用的整数标识符。下面的SQL代码片段演示了如何让MySQL在插入新用户时为我们生成这些标识符:
向用户(userid,name,password)中插入值(uuid(),'Joe','hello')
注意,用户名必须是唯一的。
除了基本的登录信息外,每个用户还有一个存储该用户附加信息的配置文件:
用户可以选择将个人资料设置为公开或私有。期望创建拍卖的用户将拥有包括联系信息的公共配置文件,而使用该系统仅对拍卖出价的用户通常将保留其配置文件的私密性。
送货地址存储在单独的送货表中。
期望每个用户至少有一个与其配置文件相关联的发货条目。配置文件表中的shipping字段将指向该条目。允许用户拥有多个送货条目,因为我们希望为在拍卖中购买物品的用户提供将这些物品运送到与其配置文件地址不同的地址(如果他们选择的话)的选项。
我们系统的核心活动是拍卖。卖家会贴出待售物品。拍卖将运行一个预定义的时间跨度,在此期间,买家可以发布出价。拍卖结束后,系统将启动销售过程,将物品出售给出价最高的竞标者。
拍卖记录存储在拍卖表中:
我们还将使用uuid作为拍卖的标识符。每次拍卖都有一个底价,这是卖家可以接受的最低出价。
整个系统将以整数形式存储货币数量。以美元和美分为单位的金额将通过乘以100转换为整数。例如,$12.95将被存储为1295。
已完成的现场记录了拍卖是否已经结束。当拍卖结束时,我们将为拍卖选择一个中标,并在购买表中设置一个条目,以管理将该项目出售给中标人的过程。
为了让用户更容易找到感兴趣的拍卖,我们将允许卖家在拍卖上附加标签。例如,一个卖旧衣服的卖家会在他们的拍卖品上贴上“旧”、“旧”和“衣服”的标签。标签存储在标签表中。
用户在拍卖上的出价存储在出价表中:
一旦拍卖结束,我们将开始将该项目的赢博体育权转移到中标人的过程。
我们可以通过查阅投标表来确定拍卖的中标人。下一步是在购买表中为中标创建一个条目。
每次购买都有效地将中标与拍卖联系在一起。用户赢得拍卖后,我们会要求他们提供送货地址。shipping字段是存储该送货地址的送货表的外键。然后,我们将要求卖方计算运费,这些运费将存储在收费字段中。一旦购买完成,商品已经发货,卖方将在跟踪字段中放置跟踪代码。
购买需要经过多个步骤。我将在下面更详细地描述这个过程。状态字段用于跟踪我们在该过程中的进展。
为了在我们的系统中管理付款,系统的每个用户将有一个内部系统余额。基本的余额信息存储在余额表中:
这些余额的任何变化都记录在单独的交易表中。
我假设系统将使用一个或多个外部提供者来管理进出系统的资金流,并且任何提供者都会为每个此类交易提供唯一的收据标识符。在事务表中,我们可以记录这些类型的事务:
原因 | 描述 |
---|---|
基金 | 将资金从外部账户转入内部账户 |
新手注意 | 将资金从内部余额转入外部账户 |
出售 | 把钱从买方转到卖方 |
负责 | 从用户账户中扣除系统费用 |
我们可以在这里建模的交易类型之一是收费类型,它表示用户向系统支付的费用。例如,拍卖系统可以从每笔交易中抽取一定比例的佣金,从卖方的账户中扣除。
当投标人赢得拍卖,我们将在购买表中为中标人创建一个条目。投标人赢得拍卖后,还有几个额外的步骤,我们将需要在结束购买之前进行。下图说明了购买过程中的步骤。
下面是关于每种状态的含义以及它们之间的转换的进一步细节。
won_bid
状态。确认
。如果他们取消购买,则从购买表中删除此购买的行,并从投标表中删除他们的出价。带电
.支付
。在这一点上,买家还有最后一次机会取消购买。如果他们取消,该行将从购买表中删除,他们的出价将从出价表中删除,我们返回开始并为拍卖选择新的获胜者。此时,如果买方在合理的时间范围内未付款,卖方也可以取消购买。运
.赢博体育程序中最重要的表之一是purchase表,它存储我们将在购买过程运行其各个阶段时收集的数据。这是那个表格的结构:
这个表的特点之一是它包含的信息刚好足够完成这项工作。例如,我们不会在这个表中记录买方或卖方的id,因为该信息已经出现在数据库中的其他表中。例如,bid字段是投标表中条目的id。该表告诉我们出价的拍卖对象,还存储了出价的用户的id。
拍卖表可以告诉我们拍卖中的卖家是谁,还可以提供有关被出售物品的其他详细信息。
我们在这里看到的是关系数据库世界中非常典型的情况:我们可能需要完整描述购买的信息在数据库中,但它分散在数据库中的多个表中。
在这种情况下,标准的补救方法是使用SQL JOIN命令将来自多个表的信息合并在一起。例如,我们可以通过使用JOIN的select来综合来自出价和拍卖表的信息:
选择竞价、拍卖、物品、卖方、竞标者、竞标者的出价,在竞价.auction=auctions.auctionid上加入拍卖
我们还可以使用这个select语句在数据库中定义一个视图。我使用这个select语句在数据库中创建了一个bid_detail视图,其中包含的信息超出了出价表能够告诉我们的信息。
我还通过在purchase表和bid_detail视图之间进行连接创建了第二个视图purchase_detail视图。这个视图用列补充了purchase表,列告诉我们投标人和卖方的id,以及投标金额。