保持诚信

时间:2009-11-10 14:43:25

标签: database-design

假设我有两张桌子

第一张表格

EmpID  | EmpName|xyz...coloums

 1.    | Hrishi |
 2.    | Nikhil |
 3.    | Hrishi |

第二表部门

DeptId |EmpId |Deptname....Xyz coloum

 1.    |1    |computer

emp和department表之间存在一对多的关系。

现在我想调用存储过程在哪里 empName将是一个输入。此存储过程将在empName = Hrishi的department表中插入empId。当然,这是不明确的。

哪个hrishi将从第1或第3个emp表中选出?

我应该如何处理这个Senario?

6 个答案:

答案 0 :(得分:2)

答案是您应该使用明确存储过程的输入,例如员工ID,而不是员工姓名。在UI中,您允许用户按名称选择用户,包括足够的信息(如电子邮件,办公室电话号码等),以允许他们选择正确的信息。但是,您的程序在调用存储过程时将使用所选员工的ID。

答案 1 :(得分:1)

有几个选项取决于您的用例:

  1. 对员工姓名实施唯一约束。这不是一个很好的解决方案,而是我们在数据仓库中常见的东西。

    创建独特的非集群索引[ixu_employee_name] ON [emp]     [EmpName] ASC )

  2. 向用户显示两个结果,并允许他们选择正确的结果。这在Intranet应用程序中是有意义的。 EmpID的基础唯一键仅代表一个单独的员工实体。如果您打算这样做,那么您应该显示多列信息,并可能显示员工图像,以便用户更容易区分人与人之间的区别。

答案 2 :(得分:1)

主键的(唯一目的)是唯一标识表中的行。您应该只在数据库或应用程序中只有一个位置生成主键。最简单的方法是使用AUTO-INCREMENT字段。

如果您按照此操作并将此示例放在2NF中,您的问题将自行解决。

  • EmpID表中删除Department,它不属于那里。

  • DeptID放入Employee表格。

    dept_model_01

答案 3 :(得分:0)

这会引起问题。

插入外键引用时,应始终将外键值传递给存储过程...否则不保证数据是唯一的。

在您的情况下,您的存储过程应该使用EmpId而不是EmpName。调用代码可能需要修改才能处理存储过程......但这是每次获得正确结果的唯一方法。

答案 4 :(得分:0)

返回的顺序是未定义的。

你基本上不应该有重复项,所以你应该对EmpName有一个UNIQUE约束。或者编写代码来处理你所描述的情况。

答案 5 :(得分:0)

作为一般规则,只要您有查询执行此操作:

select <primary key> from <table> where <other column> = <value>

暗示 <other column>是唯一的。您需要在Emp.EmpName上创建唯一约束并清理数据以符合该约束。如何清理数据取决于您的业务需求。