【问题标题】:When should I put an attribute in a separate table?什么时候应该将属性放在单独的表中?
【发布时间】:2015-05-24 22:19:30
【问题描述】:

什么时候应该将属性放在单独的表中?我的意思是我有一个属性,但是我是否应该将它与 table person 的其余属性一起放置,或者是否应该将它放在一个单独的 table 中,将 person_ID 作为 FK?

其次,关联类是什么时候形成的?它可以在一个类和它的多变量属性之间形成吗? Ex课本有属性作者。一个作者可以写很多本书,而一本书可以由很多作者写

【问题讨论】:

    标签: database database-design relational-database


    【解决方案1】:

    这取决于该属性所依赖的内容。如果它是您正在创建的实体(人)的一个属性,那么它应该放在同一个表中,但是正如您所说的,在一本书可以有很多作者而 1 个作者可以写很多书的情况下,您有考虑实体和属性之间的关系。是一对一的关系,一对多还是多对一,等等。

    话虽这么说,如果您的人对该属性只能有 1 个值,并且只有 1 人可以拥有该属性,那么它应该放在同一张表中。

    在以下情况下你应该有一个关联表:

    1 人一次可以住超过 1 所房子(住宅和度假屋),但更多人也可以住在这些房子里。

    显然,在上面的示例中,我们忽略了一个事实,即 1 个人一次不能在超过 1 个地方。

    作为一般规则,属性应该依赖于“键,整个键,只有键”

    @ruakh 所说的更新:

    如果您分离属性,它可能会产生开销,但是您可以用来适应这种开销的工具是创建表的视图。我不确定您使用的是什么数据库系统,但 MySQL 具有此功能。视图是可以在当前数据库上使用 SQL 查询创建的“虚拟”表。您可以组合多个表,并像查询普通表一样查询该视图。

    【讨论】:

    • 如何在 UML 中表示书作者关系?我应该用关联类绘制一个 M:N 关联吗?还是应该在类图中显示为 book{authors[1...*]}?
    • 这取决于您的要求,我相信它们都是该概念的有效表示。如果您需要制作实体关系图,则取决于您在创建图表时要使用的样式(鱼尾纹或陈模型)。
    【解决方案2】:

    只要您期望一个person 可以具有多个该属性,您就应该将一个属性放在一个单独的表中。否则,没有太多理由将其分开,并且这样做可能会产生一些概念上的开销。 (如果您必须编写一个检索 person 的五个不同属性的查询,如果每个属性都不必要地位于其自己的表中,这可能会非常烦人。)

    只要两个表之间的关系是多对多的,就应该在它们之间创建一个关联表。您的作者书籍示例是一个很好的例子。

    【讨论】:

    • 那么在课本和它的多元属性作者之间可以有关联类吗?课本 {authors[1...*]}
    • 还有一件事..我应该在对书籍和作者进行 OMT 设计时显示这个 M:N 关联吗?还是我应该像以前在课本上那样表现出来……?
    • @LogicianUnix:等等,你是在问你的程序——你的OO模型——是否应该有一个对应于你的数据库关联表的关联类?如果是这样,那么:可能不是。您的Author 类可能应该有一个Book 引用列表,反之亦然。但是,您可能需要AuthorBook 类的一个原因是,除了“此作者是本书的作者之一”之外,该关系是否还有其他属性。 (例如,如果您想要指示哪些章节和哪些版本的元数据,AuthorBook 可能很有用。)
    猜你喜欢
    • 1970-01-01
    • 2020-12-22
    • 2012-06-10
    • 2011-06-02
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多