SQL数据库关系

SQL数据库关系,sql,database,relational-database,Sql,Database,Relational Database,首先,我要说的是,我对现实世界中的数据库还是一个呆子,我希望能对这种情况有所了解 我最近组装了一个基本的asp web应用程序,用于管理带有两个表的SQL数据库。各表如下: 键表: 密钥id 钥匙说明 钥匙号码 钥匙位置 发行人 Emp_id Emp表: Emp_id Emp_fname Emp_lname Emp_电话 如您所见,这些表由emp_id字段链接。但是,如果未将密钥分配给员工,则密钥表允许emp_id列中的空值 既然如此,我关心的是数据库中的整体关系,而孤立记录正成为一个问题 由于

首先,我要说的是,我对现实世界中的数据库还是一个呆子,我希望能对这种情况有所了解

我最近组装了一个基本的asp web应用程序,用于管理带有两个表的SQL数据库。各表如下:

键表:

密钥id 钥匙说明 钥匙号码 钥匙位置 发行人 Emp_id

Emp表:

Emp_id Emp_fname Emp_lname Emp_电话

如您所见,这些表由emp_id字段链接。但是,如果未将密钥分配给员工,则密钥表允许emp_id列中的空值

既然如此,我关心的是数据库中的整体关系,而孤立记录正成为一个问题

由于键表允许该列的空值,这是否意味着它不在1NF中

到目前为止,web应用程序通过选择emp_id为null的所有记录,然后将emp_id分配给所选密钥,从而从密钥表中提取所有记录来分配密钥

但这种关系只有在密钥有关联的雇员时才存在,而且似乎必须有更好的方法来实现这一点

现在更改应用程序可能有点晚了,所以我问这个问题或多或少是出于好奇

我想我可能需要一个已分配的键表和一个未分配的键表,但我不知道如何将它们与当前数据库字段链接。有人能给我一些建议吗?或者帮我找到一个更好的方法把数据库连接起来

我主要关心的是孤儿记录

这是在手机上输入的,如果有错误,请原谅我

编辑:非常感谢那些对此做出回应的人。我得到的帮助比我想象的要多。等我弄清楚该走哪条路时,我会记下答案


有人告诉我这是一个正确的问题。

我认为您正在寻找的DB设计类似于以下内容(使用MySQL语法):

另外三点:

1) 还可以使用“限制/无操作”选项来防止删除主键行

2) 避免对表名或列名使用保留字,如

3) 我不喜欢在列名前面加表名,例如Emp_lname。它是多余的,可读性较差

编辑
根据@Hugh Jones的说法,我将“发布者”和“Emp\u id”列分开了-谢谢Hugh,另一种方法是创建第三个表,以记录关键任务。如果一个键是未分配的,就不要在该表中放一行。不要将emp_id外键放在keys表中

评论中关于您的问题的示例:

CREATE TABLE KeyAssignment (
  key_id INT PRIMARY KEY,
  emp_id INT NOT NULL,
  FOREIGN KEY (key_id) REFERENCES keys (key_id),
  FOREIGN KEY (emp_id) REFERENCES emp (emp_id)
);
不需要其他属性,因为键和雇员的所有详细信息都已存储在其他表中

注意上面的表并不是一个多对多的表,因为只有key_id是主键。每个密钥id只能有一行(或零行)。如果给定密钥id有一行,则emp\U id不为空,因此必须进行赋值。未分配的键在此表中没有行(直到它们被分配)

至于您的原始设计是否在1NF中,是的,大多数人都同意它在1NF中。非空Emp_id的值是employees域中的单个值,这是1NF所需的


SQL还有另外一条规则,即NULL可以被视为任何域的虚拟成员,尽管这条规则是否符合关系理论是不确定的。C.J.Date认为SQL中的NULL概念与关系理论不兼容。但E.F.Codd认识到空值的重要性,表示行的成员不适用或未知

从“密钥表”到“Emp表”是否有外键?迈克·谢里尔:目前唯一的关系是Emp_id字段是密钥表中的外键(Emp_tbl中的主键)。我真的想不出更好的方法把他们联系在一起。“钥匙”是你开门用的东西?@hugh Jones:是的,这实际上是一个钥匙管理系统,这样你就可以找到哪些员工有钥匙分配给他们,以及那些钥匙打开了什么门。好的,所以有一个非常合理的情况,钥匙仍然在保险箱里,没有分配给任何人?我想说你已经走上了正确的轨道。谢谢你。我想添加一个某种类型的赋值表,但不知道该添加哪些字段。。也不知道它与现有的两个表有什么关系。你能给我一些可能的赋值表的语法示例吗?或者我可以包括哪些领域?。。如果不是必须的话,我很犹豫是否要更改设计,但对此进行任何澄清都会有所帮助。@user3860870每个表(基或查询结果)都包含使空格语句中的某些填充为真的行。例如“密钥[k]已分配给员工[e]”。查找描述应用程序情况的语句/表格。不需要NULL。它使语句和查询复杂化。但对于SQL DBMS,NULL可以提高性能并简化约束。规范化理论不允许空值。但是,将NULL作为任何列的额外值进行推理可以进行规范化的推理。但它不像其他值,因为SQL关系运算符和逻辑运算符对它的处理方式不同。现在我更仔细地观察,您是对的,它们是独立的字段。我会编辑答案。@rob tornambe:就设计而言,这可能就是我想要的。我必须指出,我最初并没有创建表,我只是构建了一个web应用程序来处理现有的表。我正在考虑重新设计它们,这将是它派上用场的地方。我很可能会编辑列名以防止冗余。不熟悉限制/无操作。。。我要问,如果我尝试从密钥表中删除分配给员工的密钥,会发生什么情况?…它不会删除任何内容吗?该密钥将在
CREATE TABLE KeyAssignment (
  key_id INT PRIMARY KEY,
  emp_id INT NOT NULL,
  FOREIGN KEY (key_id) REFERENCES keys (key_id),
  FOREIGN KEY (emp_id) REFERENCES emp (emp_id)
);