1
create table [User]
(
    UserId int primary key identity(1,1),
    FirstName nvarchar(256) not null,
    LastName nvarchar(256) not null,
)

create table Product
(
    ProductId int primary key identity(1,1),
    UnitPrice decimal(18,2) not null, //For catalog purposes.
    Name nvarchar(1000) not null,
    Description nvarchar(max) not null,
    Stock int not null
)

create table [Order]
(
    OrderId int primary key identity(1,1),
    UserId int foreign key references [User](UserId),
    ProductId int foreign key references Product(ProductId),
    UnitCost decimal(18,2) not null, //How much it actually cost when the person bought it.
    ItemCount int not null,
    Subtotal decimal(18,2) not null
)

create table OrderDetail
(
    OrderDetailId int primary key identity(1,1),
    ?

我被困在订单系统的数据库设计上。

用户可以选择 n 个产品添加到订单请求中。有什么建议么?


按照这里给出的一些建议,这会是什么感觉?有什么陷阱吗?

create table [User]
(
    UserId int primary key identity(1,1),
    FirstName nvarchar(256) not null,
    LastName nvarchar(256) not null,
)

create table Product
(
    ProductId int primary key identity(1,1),
    UnitPrice decimal(18,2) not null,
    Name nvarchar(1000) not null,
    Description nvarchar(max) not null,
    Stock int not null
)

create table [Order]
(
    OrderId int primary key identity(1,1),
    UserId int foreign key references [User](UserId),
    DateOfOrder datetime not null
)

create table OrderDetail
(
    OrderDetailId int primary key identity(1,1),
    OrderId int foreign key references [Order](OrderId),    
    ProductId int foreign key references Product(ProductId),
    UnitCost decimal(18,2) not null,
    ItemCount int not null,
    Subtotal decimal(18,2) not null
)
4

1 回答 1

2

通常,您将拥有包含顶级订单信息(谁、何时等)的 Order 表,然后是一个 OrderItem(或 OrderDetail)表,其中包含构成订单一部分的每个产品的一行,包括以下列:

OrderId
ProductId
Quantity
etc

此 OrderItem/OrderDetail 表上 PK 的良好候选者将在 OrderId + ProductId 上。

因此,如果您在 Order 表中有 ProductId、UnitCost、ItemCount 等列,这些列在错误的位置,应该在 OrderItem/OrderDetail 表中。

更新: 要设置复合 PK,您可以执行以下操作:

create table OrderDetail
(
    OrderId int foreign key references [Order](OrderId),    
    ProductId int foreign key references Product(ProductId),
    ...other columns...,
    CONSTRAINT PK_OrderDetail PRIMARY KEY(OrderId, ProductId)
)
于 2012-01-14T20:56:23.737 回答