Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 这些表是否遵循3NF数据库规范化?_Sql_Database_Normalization - Fatal编程技术网

Sql 这些表是否遵循3NF数据库规范化?

Sql 这些表是否遵循3NF数据库规范化?,sql,database,normalization,Sql,Database,Normalization,作者表格 作者ID,主键 名字 姓氏 标题表格 TITLE\u ID,主键 NAME 作者ID,FK 域表 域ID,主键 NAME TITLE\u ID,FK 读卡器表格 读卡器ID,主键 名字 姓氏 地址 城市ID,FK 电话 城市表格 CITY\u ID,主键 NAME 借用表格 借用ID,主键 读卡器ID,fk TITLE\u ID,fk 日期 历史记录表格 READER\u ID TITLE\u ID 借款日期 返回日期 这些表是否遵循3NF数据库规范化 如果两

作者
表格

  • 作者ID
    ,主键
  • 名字
  • 姓氏
标题
表格

  • TITLE\u ID
    ,主键
  • NAME
  • 作者ID
    ,FK

  • 域ID
    ,主键
  • NAME
  • TITLE\u ID
    ,FK
读卡器
表格

  • 读卡器ID
    ,主键
  • 名字
  • 姓氏
  • 地址
  • 城市ID
    ,FK
  • 电话
城市
表格

  • CITY\u ID
    ,主键
  • NAME
借用
表格

  • 借用ID
    ,主键
  • 读卡器ID
    ,fk
  • TITLE\u ID
    ,fk
  • 日期
历史记录
表格

  • READER\u ID
  • TITLE\u ID
  • 借款日期
  • 返回日期

  • 这些表是否遵循3NF数据库规范化
  • 如果两位作者为了同一个标题一起工作会怎么样
  • 列地址应该有自己的表吗
  • 当读者借书时,我在借书表中记下一个条目。在他归还这本书之后,我删除了那个条目,并在历史表中做了另一个条目。这是个好主意吗?我有什么规则吗?我应该有一个单独的借阅表,其中有一个DATE\u OF\u RETURNING列吗

    • 我会将标题更改为多对多,并保留地址

      标题
      表格

      • TITLE\u ID
        ,主键
      • NAME
      TitleAutors
      表格

      • TITLE\u ID
      • AUTHOR\u ID

      您可以更改借阅表,使其具有条目的状态(OUT、IN、MISSING、UNKNOWN)和状态日期。

      这看起来有点像家庭作业问题,但还是让我回答一下:

    • 不,表格不在3NF中;带有代理键的表很少使用。例如,READERS表有两个候选主键:READER\u ID和(First\u Name,Last\u Name)。当然,这取决于你的问题领域:如果你愿意让两个不同的人拥有相同的姓名、地址和电话,那么就用3NF。而且,根据我的经验,3NF通常比它的价值更麻烦
    • 同样,这取决于你的问题领域。您可以通过中间表在作者和标题之间创建多对多关系
    • 见1
    • 您可以省去借用,创建一个完美工作的应用程序,因为历史记录包含您需要的所有信息。跟踪的信息越少越好

    • 你如何期望任何人在不了解你的业务领域的情况下认真回答这个问题

      为了认真地回答这个问题,需要了解管理数据的整个函数依赖关系集,而您还没有提供这些依赖关系


      例如,对于3NF中的方案,它需要domainID->titleID,或者换句话说,每个域只有一个标题,知道域意味着可以知道标题。从表面上看,这似乎很奇怪,但唯一能确定这是否准确地反映了您正在处理的业务现实的人是您。

      在阅读其他人的评论后,我想到的另一个想法是

      • 作者能成为读者吗?(反之亦然)
      如果是这样,您的系统中可能输入了多余的名字和姓氏,并且很容易出现更新异常。例如,如果简·史密斯是一名读者和作家,并且结婚了,她的姓氏改为威廉姆斯,那么就有可能更新她的读者姓氏,而不是她的作者姓氏


      您可以通过创建一个用户表来解决这个问题,其中有两个用于Authors和Readers表的外键。只是一个想法……;)

      +1另一个好主意是创建一个完整的属性ERD来帮助对数据库建模。