【问题标题】:Is this necessary to point back the relationship?这有必要指出关系吗?
【发布时间】:2010-07-06 17:50:11
【问题描述】:

情况如下: 我有一张叫做“书”的桌子,还有一张叫做“类别”的桌子。 每个“书”都属于一个类别,因此书有一个名为“类别 ID”的字段。 但是有必要制作一个“categoryList”来存储“book id”吗? 我可以使用 select 语句来查找属于类别的书籍,但是从 categoryList 中存储书籍 ID 是否更好?谢谢。

【问题讨论】:

    标签: database-design


    【解决方案1】:

    其实最好用映射表来指定分类/图书的关系。

    此表可以命名为 category_book,并且有一列用于 category_id,一列用于 book_id

    【讨论】:

    • 同意,这样你就可以拥有一本属于许多类别的书
    • 但在这种情况下,多对多关系是个坏主意。一本书怎么能放在图书馆的两个不同的书架上?这基本上就是您在多对多关系中所做的事情。
    • 事实上,多对多关系在设计上还有另一个优势。它清楚地将“我的实体是什么”与“我如何使用它们”区分开来。一本书是一本书,一个类别是一个类别,关系类别/书与一本书是什么无关
    【解决方案2】:

    如果一本书可以属于很多类别,而一个类别可以有很多书,那么您需要使用中间表(例如Books _JOIN_Categories)建立 MANY to MANY 关系。

    Books
    ID  |  BookName
    
    Categories
    ID  |  CategoryName
    
    Books_Join_Categories
    BookID  |  CategoryID
    

    如果每本书只有一个类别,但每个类别可以有很多书,那么您当前的关系结构(图书表中的CategoryID)应该可以满足您的需求。

    Books
    ID  |  CategoryID  |  BookName
    
    Categories
    ID  |  CategoryName
    

    事实上,第二种选择可能是最好的。在这种情况下,多对多关系可能不是一个好主意(除非这本书被撕成两半放在不同的书架上)。如果两个不同的“类别”部分需要同一本书,那么每个类别(图书馆中的部分)都将获得它们自己的物理本书副本。意思是数据库中有两条书籍记录,每条记录都有一个单独的CategoryID

    【讨论】:

      【解决方案3】:

      在您的previous question 中,您说一本书只属于一个类别。因此,您不需要 CategoryList 表。那是额外的维护,没有额外的好处。支持按类别查询是 Nature 为我们提供索引的原因。

      【讨论】:

      • 在真正的图书馆中,一本书有时很难同时放在两个书架上,但不同的馆藏可能有自己的副本。在图书馆中,每本书的副本都必须有自己的标识符和分配。
      • 如果图书馆购买多本图书,那么数据库“应该”拥有该图书的多条记录(每本实体图书一条记录),并相应地分配类别 ID。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2013-11-17
      相关资源
      最近更新 更多