【问题标题】:Database design: How can I design my database in order to not have repeated entries of the same product?数据库设计:我如何设计我的数据库,以避免同一产品的重复条目?
【发布时间】:2023-10-21 02:49:01
【问题描述】:

我有一张桌子产品和桌子尺寸。每个产品可以有多种尺寸。我如何设计我的数据库以避免同一产品的重复条目?

【问题讨论】:

  • 这是作业吗?如果是,请标记它[作业]。请向我们展示您到目前为止所做的工作。这不是www.do_my_homework_for_me.com
  • 这不是家庭作业。我试图理解规范化。我已经创建了数据库和表,但我无法确定映射表...
  • 这是一个 m:n 关系。您无法避免重复您的产品或您的尺寸。这就是为什么你应该使用内存高效的主键。

标签: database-design


【解决方案1】:

多对多关系的典型方法是使用一个名为 Product_Size 的映射表,其中包含每个表的主键。

create table Product (
    id uniqueidentifier not null,
    name varchar(255),
    primary key (id))

create table Size (
    id int,
    name varchar(255),
    primary key (id))

create table Product_Size (
    productId uniqueidentifier,
    sizeId int,
    primary key (productId, sizeId),
    foreign key (productId) references Product(id),
    foreign key (sizeId) references Size(id))

【讨论】:

  • 除非出于性能原因,我不会在表中使用唯一标识符作为 PK,除非我别无选择。大多数时候,INT 是更好的选择。
【解决方案2】:

视情况而定,每个产品可以有多个尺寸,但不同的产品可以有相同的尺寸吗?

如果他们不能,那么您有一个一对多的关系,您需要一个 ProductSize 表来保存产品的主键。

ProductSize (SizeID, ProductID, Size)

如果他们可以,那么您可以建立多对多关系,您可以通过三个表来打破这种关系:Product、Size 和 ProductSize,其中 Product 包含产品,Size 包含尺寸,ProductSize 将每个产品映射到可用的尺寸,通过持有 Product 和 Size 的主键。

Product (ProductID, ProductName)
Size (SizeID, SizeName)
ProductSize (ProductID, SizeID)

【讨论】:

    【解决方案3】:
    product Table
    
     1. product id 
     2. product name
     ......
    
    Product Size
    
     1. Id
     2. ProductId( Foreign key form product table)
     3. Size 
    

    【讨论】:

      【解决方案4】:

      试试这样的:

      Products
      ----------
      ProductID    PK, auto increment int
      ProductName
      ....
      
      Sizes
      ------- 
      SizeID      PK, auto increment int
      SizeInfo
      ....
      
      ProductSizes
      --------------
      ProductID   PK, FK to Products.ProductID
      SizeID      PK, FK to Sizes.SizeID
      

      【讨论】: