【问题标题】:Table design for keywords关键词表设计
【发布时间】:2011-02-14 18:02:02
【问题描述】:

我有很多关键字,每个关键字都有一个单词列表

说关键字是 SCIENCE , COMPUTERS, STRUCTURES

每个关键字下都有一个单词列表,如

科学——植物学、动物学、物理学.....

计算机 - 数据库、操作系统、.....

结构 - 堆栈、队列、数组……

我需要将其存储在我的数据库中,对此有什么好的设计?将它们存储在单个表中似乎很愚蠢,因为它们彼此不相关,但创建不同的表似乎也是一种开销!所以在这里我很困惑。

【问题讨论】:

  • 你只有两个层次(关键词和词)还是可以进一步细分词?

标签: sql ruby-on-rails database database-design rdbms


【解决方案1】:

我认为应该这样做。

Category (ID, NAME)
  1  Science
  2  Computers
  3  Structures


SubCategory(ID, CATID, NAME)
  1  1  botany
  2  1  zoology
  3  2  databases

subcategory 中的CATID 是引用category 表中的ID 的外键。

【讨论】:

  • 为了正确性而存储数据不是“开销”。这里建议的两表方法可以让您保持直截了当,使应用程序代码更易于编写、调试和维护。换句话说,开销更少。
【解决方案2】:

您以错误的方式思考“关系”。虽然植物学确实与数据库无关(除了一些非常非常罕见的极端情况),但您查看的是数据,而不是事物。 p>

如何建模取决于您如何查看这些关键字。这是一个严格的单亲关系吗,其中子关键字永远不能有子关键字,而子关键字与父关键字有根本的不同(换句话说,父关键字仅用作分类机制而不是,自己,关键字)?或者你可以任意深度“嵌套”这些关键词并将它们用作任何级别的关键词(换句话说,“植物学”可能有孩子,而“科学”和“植物学”一样是一个关键词)?

如果它是第一个,你会想要这样建模:

Category
----------
CategoryID (PK)
Name

Keyword
---------
KeywordID (PK)
CategoryID (FK)
Name

如果是第二个,你可以这样建模:

Keyword
---------
KeywordID (PK)
ParentKeywordID (FK)
Name

其中ParentKeywordID 是返回Keyword 的可空外键。您已经创建了一个引用自身的表,并且像这样的结构定义了一个树结构,其中的节点可以嵌套在任何级别。

旁注

很多人会告诉你,将null 值存储在数据库中是个坏主意,我总体上同意这些人的观点。如果您真的想采用完全标准化的存储格式(无论如何都标准化为 5NF),您必须这样做:

Keyword
-----------
KeywordID (PK)
Name

KeywordParent
-------------
KeywordID (PK, FK)
ParentKeywordID (FK)

那么您的顶级关键字根本不会在KeywordParent 中包含行。

从数据库设计的角度来看,这种设计通常被认为是“更好的”,尽管它会使您的查询稍微复杂化(仅在它们的构造中;它们不会表现得更差,实际上可能会表现得更好 /em> 没有可以为空的列)。

【讨论】:

    【解决方案3】:
    KeyWords (ID, PARENT, NAME)
    
    1 null Science 
    2 null Computers
    3 null Structures
    4  1   botany
    5  1   zoology
    6  2   databases
    

    典型的树结构。

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2023-01-01
      • 1970-01-01
      • 2014-07-09
      相关资源
      最近更新 更多