【问题标题】:Prevent denormalization防止非规范化
【发布时间】:2021-01-09 01:02:43
【问题描述】:

我想知道在这种情况下如何防止非规范化:

Table Categories:

- id
- name

Table Category_types:

- id
- name

Association table: (category and category types are in a many-to-many relationship)

- id
- id_cat
- id_cat_type

我有一张表Request,我必须在其中存储有关CategoryRequestCategoryType 的信息。 目前架构是:

Request:

 - id
 - title
 - desc
 - id_cat
 - id_cat_type

顺便说一句,我认为这是一个坏主意,因为 id_cat 和 id_cat_type 之间存在函数依赖关系(我猜?)。 我想我可以解决这个存储关联表的id的问题

Request:

 - id
 - title
 - desc
 - id_association_table

我知道拆分表可能是这里的最佳选择,但我想知道是否有其他方法可以解决此类问题。

谢谢

【问题讨论】:

  • 如果一个类别可能只有一种类别类型,您最好只在引用Category_types.idCategories 表中添加一个新列。如果不是这种情况,那么您在谈论的功能依赖是什么?无论如何,您所写的仅用于此目的的关联表似乎是多余的。
  • 嗨,对不起,也许我必须编辑我的问题以明确解释 Category 和 CategoryType 存在多对多关系。这就是为什么我需要关联表
  • 好的,现在变得更容易了。您必须了解使用关联表的所有可能方式。如果您打算仅对请求使用所谓的“功能依赖”,则让Request 成为关联表本身,否则使用单独的表。这两种方法都很好,您只需要决定哪种方法最合适。
  • 这个不清楚。您没有明智地使用术语。 “防止非规范化”是什么意思?你认为“非规范化”是什么意思?你认为“标准化”是什么意思?请通过编辑而不是 cmets 进行澄清。 PS 如果您不知道某处是否有 FD,请查找教科书和相关定义、事实、算法和启发式方法并询问 1 个(具体研究非重复)问题,了解您第一次遇到的问题。如果你不知道如何去做你想做的任何事情,同样的事情。但目前尚不清楚您的目标是什么,或者您的“问题”或疑问是什么。
  • @PavelSmirnov 感谢您的帮助!我认为就我而言,最好的方法可能是使用单独的表格。那是因为我希望每个Request 都尊重CategoryCategory Type 之间定义的关联约束。我不希望每个Request 都定义自己的关联。

标签: database database-design database-normalization functional-dependencies denormalization


【解决方案1】:
-- Category CAT exists.
--
category {CAT}
      PK {CAT}
-- Category type TYP exists.
--
ctype {TYP}
   PK {TYP}

对于每个类别,该类别可能属于多个类别类型。对于每个类别类型,可能有多个类别属于该类别类型。

-- Category CAT is of type TYP.
--
category_ctype {CAT, TYP}
            PK {CAT, TYP}

FK1 {CAT} REFERENCES category {CAT}
FK2 {TYP} REFERENCES ctype    {TYP}
-- Request REQ is of category CAT, category type TYP.
--
request {REQ, CAT, TYP}
     PK {REQ}

FK {CAT, TYP} REFERENCES category_ctype {CAT, TYP}

注意:

All attributes (columns) NOT NULL

PK = Primary Key
FK = Foreign Key

【讨论】:

  • 谢谢,这很明显,但我没想到 :D 干得好
猜你喜欢
  • 2013-08-21
  • 2016-05-13
  • 2018-06-06
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多