【问题标题】:Access Database NormalizationAccess 数据库规范化
【发布时间】:2014-07-09 03:56:08
【问题描述】:

我目前正在尝试规范化现有数据库。我的问题与此视频http://youtu.be/4q-keGvUnag?t=5m1s 大约 5 分钟时出现的问题类似。

他说不应该做的(有两个作者的书有两个专栏)是我的数据库存在的问题。我想知道查询是否可以将表修改为只有一个作者列并为每个作者单独行。

所以:

(1) [书名] [isbn] [作者#1] [作者#2]

应该是这样的:

(1) [书名] [isbn] [作者#1]

(2) [书名] [isbn] [作者#2]

【问题讨论】:

  • 同一本书有两行真的是更好的解决方案吗?似乎作者应该是它自己的表。

标签: mysql sql ms-access database-design normalization


【解决方案1】:

我认为,既然关系是 M:N,那么应该有一个书作者关系的交集表:

书桌

bookId (PK)   | bookTitle     | isbn | etc...

作者表

authorId (PK) | authorName    | etc...

交点表

bookId (PK)   | authorId (PK) | etc...

在数据库方面,这是最正确的方法。

如果您对作为一个实体的作者不感兴趣,您可以跳过authors 表,将intersection 表中的authorId 替换为authorName

【讨论】:

    【解决方案2】:

    我不认为你在这里描述的是规范化。在规范化数据库中,您将拥有

    Table1 -  bookId, title, isbn, authorId
    Table2 -  authorId, Name...
    Table3 -  book_authorId, bookId, authorId <-- assign authors to book
    

    但是对于您的具体问题,您描述的方式,在这里您可以做什么。首先,创建第二条记录:

    Insert into <table> (title, isbn, author#1) 
         Select title, isbn, author#2 from <table> where not author#2 is null
    

    这里有描述http://msdn.microsoft.com/en-us/library/office/bb208861%28v=office.12%29.aspx

    现在,您可以删除列author#2

    这些操作应该会创建您在问题中描述的内容

    【讨论】:

    • 投反对票的人这样做是对的,因为我确实没有输入多对多分配表。现在已经修复了
    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 2012-06-21
    相关资源
    最近更新 更多