在开发数据库时,是否必须在数据库的每个表中定义主键或外键?

时间:2010-12-14 15:34:12

标签: database relational-database

在开发数据库时,然后使用compolsury在数据库的每个表中定义主键或forign键,如果任何表不包含任何唯一字段,那么我们如何将表连接到其他表。 假设我有三个tabe。

table1 Personel Detail

Emai_Address (PK)
Name
City
ContactNo
Land_Line_No
D_O_B
Gender
Marital_Status
Language_Known

Table2 Professiona_Detail

Total_Experiance
Annual_Salary
Functional_Area
Current_Industry
Key_Skill
Resume_HeadLine

表3 WorkPreference

Specify Your Preference
Start Working
Prefered Location
Job Type

Obove Table1包含PK,但Table2或表3不包含任何Pk或FK,那么如何连接这三个表。

4 个答案:

答案 0 :(得分:2)

没有。这不是强制性的。但 HIGHLY 推荐!

一些SQL大师曾经说过:

  

如果它没有主键,则不是表格!

以该声明为生!

外键会使您的数据库更安全,并避免“僵尸”行。再说一遍:从一切手段来说,它不是强制性的或技术上必要的,但如果从一开始就不知道它,你就会陷入麻烦之中!相信我......在那里,清理那个烂摊子......

答案 1 :(得分:2)

Table2Table3应该有FKTable1。否则,您将不知道这些表中的记录适用于哪个人。每个表还应该为其定义PK。这样您就可以在执行UPDATESDELETES时唯一标识一行。

答案 2 :(得分:1)

除了作为开发人员之外,没有什么能够强制执行主/外键。

它们不是强制,但是最佳做法,应该创建。

答案 3 :(得分:1)

开发对数据库进行建模时,如果任何不包含任何唯一字段的表,我们如何连接数据库的每个表中的compolsury定义主键或forign键与其他表格的表格。

(1)是的。

您在第6步遇到并发症和困难,因为您尚未完成第5步。必须按顺序执行这些步骤。

关系数据库要求每个表中的行(不是标识列)是唯一的。这是强制性的。如果这些行不是唯一的,那么它不是一个关系表,它是另一个东西,一桶鱼。

之后FKs等会很容易。在那之前,FKs等是不可能的。

(2)您已经为Person提供了一个非常好的,稳定的唯一标识符。 ProfessionalWorkPreference表缺少一两列。他们不会独自坐着。 ProfessionalWorkPreference适用于哪些人或哪些人?

他们属于Person。到目前为止,您唯一的Person标识符为EmailAddress。因此EmailAddress需要添加到ProfessionalWorkPreference

EmailAddressProfessionalWorkPreference中的PK。

EmailAddress也是ProfessionalWorkPreferencePerson中的FK。 (到目前为止,基数是1:1。)

(3)现在你可能还需要Person.Name上的唯一约束,但是你必须处理两个“Bob Smith”和“Bob Smith”vs“Smith,Bob”vs“Robert Smith”。所以还有一些工作要做。如果它是一个简单的数据库,那么Person.Name可能就足够了。

就是这样,任务在逻辑层完成。

(4)现在在物理层面(用户看不到的元素),您可能会认为在子表中携带CHAR(30)EmailAddress因性能原因而不合理,所以您可以添加一个狭窄的代理键Person,例如PersonId INT代理键始终是附加列和索引;它不是自然键的替代品;您仍然需要EmailAddress UNIQUE作为维护行唯一性的自然键。

然后,您可以在PersonId中使用Person作为PK。

然后,您将PersonId作为FK和PK迁移到ProfessionalWorkPreference; 而不是 EmailAddress

但是你不能放弃Person.EmailAddress UNIQUE,因为这是在Person中维护唯一行的基础。