【问题标题】:How could I structure this database?我该如何构建这个数据库?
【发布时间】:2014-03-26 20:56:42
【问题描述】:

我们有一个数据库,每个数据库都有一堆类别。层次结构是这样的:

Department
-- Necklaces
   -- N_Diamond
      -- N_D_Silver
   -- N_Silver
-- Rings
   -- R_Diamond
   -- R_Gemstone

每个顶级类别(项链、戒指)都有一个父类别(部门),而这些顶级类别中的每个类别都只有一个父类别(即 N_Diamond 是 N_D_Silver 的父类别)。

在每个类别中,都会有一个产品列表。每个产品可以属于多个类别(一对多?)。

如何在数据库中组织这些?一个产品表,其中每一行都是一个产品+它所在的类别?这意味着每个产品可以有几行。不过,这似乎不太规范。

【问题讨论】:

  • 我想知道子类别(项链、戒指、N_Diamond 等)本身是否有属性/字段,因为这可能是 generalization/specializationsuperclass/subclass 的情况,否则您只需创建参考表正如下面已经给出的答案所示。

标签: sql database-design


【解决方案1】:

我会按照以下方式对其进行建模:

create table dbo.Type
(
  id int not null identity(1,1) primary key ,
)

create table dbo.TypeAttribute
(
  typeId int not null foreign key references dbo.Type(id) ,
  id     int not null identity(1,1) unique ,

  primary key ( typeId , id ) ,

)

create table dbo.Product
(
  id     int not null identity(1,1) unique ,
  typeId int not null foreign key references dbo.Type(id) ,

  primary key ( id , typeId ) ,
)

create table dbo.ProductAttribute
(
  productId   int not null ,
  typeId      int not null ,
  attributeId int not null ,

  primary key ( productId , typeId , attributeId ) ,
  foreign key ( productId , typeId      ) references dbo.Product       ( id     , typeId ) ,
  foreign key ( typeId    , attributeId ) references dbo.TypeAttribute ( typeId , id    ) ,

)
  • 我们有一组独特的Types,即产品的父类别。
  • 每个这样的Type 都有一定数量的TypeAttributes,是该特定类型项目的描述性属性。
  • 我们有多个Products,每个都分配给一个且只有一个Type
  • 我们有一个关联实体ProductAttribute,它列举了每个独特产品拥有的属性,这些属性来自该产品的Type 的可用属性。

【讨论】:

    【解决方案2】:

    好吧,使用树形结构 表将有rows idparent_categorychild_category。 所以一个典型的行是

    1, Departments, Necklace
    2, Departments, Rings
    3, Neckless, N_Diamonds
    3, Neckless, N_Silver
    ...
    10, R_Gemstone, null
    

    您可以通过索引对其进行规范化。

    现在为引用上述树的产品创建一个表 Product_Tablerows idcategory_idproduct_name

    【讨论】:

    • 我不确定我是否遵循这句话:“您可以通过索引来规范化它。”你能详细说明一下吗?
    • 抱歉迟到了,我的意思是说不要重复文本 N Diamonds 或 Necklace,您可以创建另一个名为 ProductType 的表,其属性为 id、type、description,然后仅使用外键引用产品类型 ID
    【解决方案3】:

    可能很简单:

    Product (ProductID, Name, details)
    Department (DepartmentID, DepartmentName, ParentDepartmentID)
    ProductDepartment (DepartmentID, ProductID)
    

    您可以将部门级别的层次结构分成不同的表,理想情况取决于使用情况。

    【讨论】:

      猜你喜欢
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 2021-06-05
      • 1970-01-01
      相关资源
      最近更新 更多