Database design 保持诚信

Database design 保持诚信,database-design,Database Design,假设我有两张桌子 第一表emp EmpID | EmpName|xyz...coloums 1. | Hrishi | 2. | Nikhil | 3. | Hrishi | 第二桌部 DeptId |EmpId |Deptname....Xyz coloum 1. |1 |computer emp和部门表之间存在一对多关系 现在我想调用一个存储过程,其中 empName将作为一个输入。此存储过程将在department表中插入empId,其中em

假设我有两张桌子

第一表emp

EmpID  | EmpName|xyz...coloums

 1.    | Hrishi |
 2.    | Nikhil |
 3.    | Hrishi |
第二桌部

DeptId |EmpId |Deptname....Xyz coloum

 1.    |1    |computer
emp和部门表之间存在一对多关系

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

从emp表1或表3中选择哪个hrishi


我该如何处理这个senario?

这会引起问题

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


在您的情况下,存储过程应该采用EmpId而不是EmpName。调用代码可能必须修改才能处理存储过程……但这是每次都能得到正确结果的唯一方法。

这会导致问题

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


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

返回的顺序未定义


基本上不应该有重复项,因此应该对EmpName有唯一的约束。要么这样,要么编写代码来处理您正在描述的情况。

它们返回的顺序未定义


基本上不应该有重复项,因此应该对EmpName有唯一的约束。或者编写代码来处理您正在描述的情况。

根据您的用例,有两个选项:

  • 对员工姓名实施唯一约束。这不是一个很好的解决方案,但这是我们在数据仓库中经常遇到的问题

    在[emp]上创建唯一的非聚集索引[ixu_employee_name] [EmpName]ASC )

  • 向用户显示这两个结果,并允许他们选择正确的结果。这在内部网应用程序中是有意义的。EmpID的底层唯一键只表示一个单独的雇员实体。如果要执行此操作,则应显示多列信息,可能还应显示员工图像,以便用户更容易区分不同的人


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

  • 对员工姓名实施唯一约束。这不是一个很好的解决方案,但这是我们在数据仓库中经常遇到的问题

    在[emp]上创建唯一的非聚集索引[ixu_employee_name] [EmpName]ASC )

  • 向用户显示这两个结果,并允许他们选择正确的结果。这在内部网应用程序中是有意义的。EmpID的底层唯一键只表示一个单独的雇员实体。如果要执行此操作,则应显示多列信息,可能还应显示员工图像,以便用户更容易区分不同的人


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

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

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

    select <primary key> from <table> where <other column> = <value>
    
    从其中选择=
    

    这意味着
    是唯一的。您需要在
    Emp.EmpName
    上创建一个唯一的约束,并清理数据以符合该约束。清理数据的方式取决于您的业务需求。

    一般来说,每当您有一个执行此操作的查询时:

    select <primary key> from <table> where <other column> = <value>
    
    从其中选择=
    
    这意味着
    是唯一的。您需要在
    Emp.EmpName
    上创建一个唯一的约束,并清理数据以符合该约束。如何清理数据取决于您的业务需求。

    主键的(唯一)用途是唯一标识表中的一行。在数据库或应用程序中,应该只有一个生成主键的位置。最简单的方法是使用自动递增字段

    如果您遵循此步骤并将此示例放入2NF,您的问题将自行解决。

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

    • DeptID
      放入
      Employee
      表中。

    主键的(唯一)用途是唯一标识表中的行。在数据库或应用程序中,应该只有一个生成主键的位置。最简单的方法是使用自动递增字段

    如果您遵循此步骤并将此示例放入2NF,您的问题将自行解决。

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

    • DeptID
      放入
      Employee
      表中。


    您没有问这个问题,但答案还是在这里。您的部门表不是第二标准格式。在部门工作的所有员工都会重复部门名称。如果在其中一行中拼写错误,则表示数据库自相矛盾