电子商务产品管理数据库模型(从编码员和 DBA 的角度)






2.70/5 (7投票s)
从编码员的角度学习一种有趣的数据库设计方法。
引言
本文涉及以下内容:
- 从程序员角度进行数据库设计的需求分析
- 已设计数据库的测试
- “电子商务网站产品部分”的数据库
本文对于目前没有行业经验但希望设计大型项目数据库的学生来说非常有用。本文包含许多基础知识。希望您喜欢这篇文章。
背景
任何电子商务企业通常都包含以下组件(考虑数据库):
- 客户管理
- 产品管理
- 订单处理与管理
- 发货管理
- 仓库管理
- 卖家管理
- 管理员活动区域
在本文中,我将重点关注第2点,即“产品管理”,这意味着通过数据库的这一部分实现产品的全面管理。
产品管理数据库的需求分析
从高层次来看,以下几点可能是任何电子商务网站的典型需求:
要求 1
产品应按类别和子类别进行分类。
解释
假设有一个产品i-phone,广义上它是“手机”,更广义或更专业地说,它属于“电子产品”类别,因为手机是电子产品。
因此,总而言之,我们需要通过“类别”和“子类别”来概括产品
程序员视角
如果我是一名程序员,我会通过创建以下类型的屏幕来处理这个问题:
- 类别和子类别的下拉列表;子类别下拉列表在选择类别之前不会填充。
- 一旦用户选择了类别下拉列表,子类别就会被填充。
数据库管理员视角
如果我是一名数据库管理员,我将通过创建以下内容来处理这个问题:
a) 为类别和子类别创建独立的查找表,并建立一对一关系。
这带来的长期效益
- 未来表中外键数量的减少。
- 由于保持了规范化级别并且可以轻松实现查询优化,因此可以大大节省查询执行时间。
提议的架构
类别表
注意,前缀“M”用于关键字“Master”
    CREATE TABLE [dbo].[M_Product_Category](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [Product_Type] [nvarchar](50) NOT NULL,
    [Description] [nvarchar](100) NULL,
    [Updated_By] [nvarchar](50) NULL,
    [IsActive] [bit] NULL,
    [Last_Updated_Date] [datetime] NULL)
表上的约束
- Id列将是主键,并且是产品子类的外键。
- 如果 `IsActive` 为 `1` 表示记录处于活动状态,如果为 `0` 则记录不处于活动状态,并且在执行任何 `select` 查询时,我们需要使用筛选器 `'Select......where "IsActive=1"'`
- 所有后续表的“Updated_By”列将是“System Admin”。考虑到它将由系统管理员更新。
- Last_Updated_Date将具有默认值 `GETDATE()` 以自动获取日期值。

子类别表
  CREATE TABLE [dbo].[M_Product_SubCategory](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [FK_Product_Id] [bigint] NOT NULL,
    [Product_Sub_Category] [nvarchar](100) NULL,
    [Description] [nvarchar](200) NULL,
    [Updated_By] [nvarchar](50) NULL,
    [Last_Updated_Date] [datetime] NULL,
    [IsActive] [bit] NULL) 
 要求 2
要求 2
- 2.1 销售的产品可以是公斤、单位、升或磅等。
- 2.2 产品可以用任何货币出售,例如美元、欧元或印度卢比等。
程序员视角
如果我是程序员,我只会在屏幕上放置两个下拉列表,一个用于销售单位,一个用于货币。
数据库管理员视角
- 预计此表将来数据量会非常少 :) 所以我将只创建两个独立的查找表或主表。
单位相关表结构
CREATE TABLE [dbo].[M_Price_Decision_Factor](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [Price_Decision_Factor] [nvarchar](50) NULL,
    [Description] [nvarchar](500) NULL,
    [Updated_By] [nvarchar](50) NULL,
    [Last_Updated] [datetime] NULL,
    [IsActive] [bit] NULL)

货币相关表结构
CREATE TABLE [dbo].[M_Currency_Domiance](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [Currency_Type] [nvarchar](50) NULL,
    [Description] [nvarchar](200) NULL,
    [Updated_By] [nvarchar](50) NULL,
    [Last_Updated] [datetime] NULL,
    [IsActive] [bit] NULL) 

要求 3
- 3.1 每条产品信息都应附带其卖家的信息。
	- 3.1.1 需要在卖家层面进行泛化,以区分不同类型的卖家。
 
- 3.2 每条产品信息最多可包含10张图片和5个视频。
程序员视角
如果我是程序员,我将再次使用级联下拉列表来获取卖家信息,例如第一个下拉列表将显示卖家类型,然后是卖家子类别的下拉列表,然后是几个文本框来填写其他详细信息。
数据库管理员视角
如果我是数据库管理员,我将执行以下操作:
- 卖家类别查找表
- 卖家子类别查找表,其外键引用- 卖家类别查找表的主键。
- 两个不同的查找表,分别用于图片和视频,它们都将拥有Product_Id作为外键,该外键将引用Product表的主键。
提议的架构
卖家类别表
    CREATE TABLE [dbo].[M_Seller_Category](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [Seller_Category] [nvarchar](100) NULL,
    [Description] [nvarchar](500) NULL,
    [Last_Updated] [datetime] NULL,
    [Updated_By] [nvarchar](100) NULL,
    [IsActive] [bit] NULL)

卖家子类别表
  CREATE TABLE [dbo].[M_Seller_SubCategory](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [FK_Seller_Id] [bigint] NULL,
    [Seller_Sub_Category] [nvarchar](50) NULL,
    [Description] [nvarchar](200) NULL,
    [Updated_By] [nvarchar](50) NULL,
    [Last_Updated] [datetime] NULL,
    [IsActive] [bit] NULL)

图片表
CREATE TABLE [dbo].[M_Product_Image_Details](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [FK_Product_Id] [bigint] NOT NULL,
    [Product_Image_1] [nvarchar](300) NULL,
    [Product_Image_2] [nvarchar](300) NULL,
    [Product_Image_3] [nvarchar](300) NULL,
    [Product_Image_4] [nvarchar](300) NULL,
    [Product_Image_5] [nvarchar](300) NULL,
    [Product_Image_6] [nvarchar](300) NULL,
    [Product_Image_7] [nvarchar](300) NULL,
    [Product_Image_8] [nvarchar](300) NULL,
    [Product_Image_9] [nvarchar](300) NULL,
    [Product_Image_10] [nvarchar](300) NULL,
    [Updated_By] [nvarchar](50) NULL,
    [Last_Updated] [datetime] NULL,
    [IsActive] [bit] NULL)
视频表
CREATE TABLE [dbo].[M_Product_Video_Details](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [FK_Product_Id] [bigint] NULL,
    [Product_Video_1] [nvarchar](300) NULL,
    [Product_Video_2] [nvarchar](300) NULL,
    [Product_Video_3] [nvarchar](300) NULL,
    [Product_Video_4] [nvarchar](300) NULL,
    [Product_Video_5] [nvarchar](300) NULL,
    [Updated_By] [nvarchar](50) NULL,
    [Last_Updated] [nchar](10) NULL,
    [IsActive] [bit] NULL)
要求 4
- 4.1 一个产品可以有多个变体,每种变体的价格都会不同。例如,变体指的是产品的变化,比如一件T恤可以是红色或蓝色,一本书可以是一本小说或一本学术书籍,一部手机可以是安卓手机或Windows手机,一个手机壳可以是蓝色或红色,适用于同一公司和同一型号。
- 4.2 产品可以有折扣。
- 4.3 产品可以有特殊的销售方案,比如如果您购买10件产品,产品价格将是'A',如果您购买'N'件产品,产品价格将是'X'。简而言之,为了支持批量采购订单,产品的价格应随着产品数量的增加而改变。
- 4.4 将有两种订单模式
	- 批量模式
- 普通模式 在批量模式下价格会有所不同
 
程序员视角
作为一名程序员,我希望在订单屏幕上实现以下功能:
- 一个用于选择批量模式或普通模式的下拉菜单
- 我将在代码层面进行价格计算,因为在代码层面,价格计算会更快
数据库管理员视角
我提议的数据库架构如下
产品表
| 列名 | DataType | 注释 | 
| ID | bigint | 主键 | 
| FK_Price_Decision_Factor | bigint | Price_Decision_Factor的外键 | 
| FK_Product_Subcategory | bigint | 产品子类的外键 | 
| FK_Seller_Id | bigint | 卖家子类的外键 | 
| FK_Product_Varient | bigint | 产品变体的外键 | 
| FK_Currency_Dominance | bigint | 货币主导的外键 | 
| 产品名称 | nvarchar(100) | 产品名称 | 
| 描述 | nvarchar(MAX) | 产品描述 | 
| 价格 | nvarchar(100) | 产品价格 | 
| SKU | nvarchar(50) | 产品SKU | 
| 可用数量 | bigint | 产品可用数量 | 
| 百分比折扣 | float | 如果不是批量订单,则按百分比折扣 | 
| 特惠价格 | nvarchar(100) | 特惠价格 | 
| 特惠最低数量 | nvarchar(10) | 特惠最低数量 | 
| 特惠最高数量 | nvarchar(10) | 特惠最高数量 | 
| 特惠折扣系数 | float | 在批量订单情况下 `Price=(Special_Offer_Discount_Factor * 单个产品价格)` | 
| 允许购买的最低数量 | nvarchar(10) | 如果不是批量订单,则为允许数量的下限 | 
| 允许购买的最大数量 | nvarchar(10) | 如果不是批量订单,则为允许数量的上限 | 
| 更新者 | nvarchar(50) | |
| 最后更新日期 | datetime | |
| 是否活跃 | bit | 
变体表
注意:变体将包含两个表,一个是主表,另一个是变体值表,它们与主表具有一对N关系,这意味着M_Product_Varient表的主键将是Product_Varient_Value表的外键。
变体主表
CREATE TABLE [dbo].[M_Product_Varients](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [Varient_Name] [nvarchar](50) NULL,
    [Varient_Description] [nvarchar](100) NULL,
    [Updated_By] [nvarchar](50) NULL,
    [Last_Update] [datetime] NULL,
    [IsActive] [bit] NULL)

变体值表
CREATE TABLE [dbo].[Product_Varient_Value](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [FK_Varient_Id] [bigint] NULL,
    [Varient_Value] [nvarchar](50) NULL,
    [Description] [nvarchar](max) NULL,
    [Updated_By] [nvarchar](50) NULL,
    [Last_Updated_Date] [datetime] NULL,
    [IsActive] [bit] NULL)

最终总体数据库图

Using the Code
步骤
- 按照描述创建表格
- 最终查询将如下所示:(注意您可以根据需要自定义或创建查询)
SELECT 
Product.Product_Name,
Product.Description, Product.Price, Product.SKU,
Product_Varient_Value.Varient_Value,Seller.Seller_Sub_Category,
Currency.Currency_Type,Price_Decision.Price_Decision_Factor,
Product.Availability_Count, Product.Percentage_Discount,
Product.Special_Offer_Price,Product.Special_Offer_Minimum_Quantity,
Product.Special_Offer_Maximum_Quantity,Product.Special_Offer_Discount_Factor,
Product.Minimum_Allowed_Buy_Quantity,Product.Maximum_Allowed_Buy_Quantity,
Subcategory.Product_Sub_Category,M_Product_Category.Product_Type 
FROM
Product INNER JOIN Product_Varient_Value ON Product.FK_Product_Varient = Product_Varient_Value.Id
Inner Join M_Seller_SubCategory Seller ON Seller.Id=Product.FK_Seller_Id 
inner join M_Currency_Domiance Currency on
Currency.Id=Product.FK_Currency_Dominance inner join M_Price_Decision_Factor Price_Decision
ON Price_Decision.Id=Product.FK_Price_Decision_Factor 
inner join M_Product_SubCategory Subcategory
ON Subcategory.Id=Product.FK_Product_Subcategory 
inner join M_Product_Category M_Product_Category
ON M_Product_Category.Id=Subcategory.FK_Product_Id Where Product.IsActive=1
最终输出将如下所示

非常感谢阅读我文章的人。希望您从本文中有所收获。:) 再次感谢阅读 :)

