你的第一直覺(存儲客戶和聯繫人在一個表中)是正確的。如果你仔細想想,客戶和聯繫人都是人。只是客戶和緊急聯繫人都是人員的特殊情況。我們可以使用關係數據庫對此進行建模。
讓我們創建一個表,用於存放人信息:
create table tblPeople (
ID autoincrement primary key
, FirstName varchar(100)
, LastName varchar(100)
, Notes memo
)
現在,讓我們有一個表,用於存放客戶信息,但執行的事實,客戶還必須以人:
create table tblCustomers (
ID long primary key
constraint Customers_ID
references tblPeople (ID)
, EmergencyContactID long
constraint Customers_EmergencyContactID
references tblPeople (ID)
)
這稱爲一對一關係,用於實現專業化 - 就像面向對象編程中的繼承。
您在這裏有一個選擇。你想讓每個人擁有任意數量的任意類型的電話號碼嗎?這顯然更普遍,更強大。但也比較複雜。還是你想回去爲每個人儲存固定數量的電話號碼?
比方說,你想要做前者只是爲了一路走來。在這種情況下,你需要一個表來保存電話號碼:
create table tblPhoneNumbers (
ID autoincrement primary key
, PhoneNumber varchar(15)
)
注意如何在這裏我們不指定它是什麼類型的電話號碼什麼。這部分是下一:
create table tblPhoneNumberTypes (
ID autoincrement primary key
, PhoneNumberType varchar(20) not null
)
現在我們每個人提供一個電話號碼和類型相關聯:
create table tblPeople_to_PhoneNumberTypes_to_PhoneNumbers (
PersonID long not null
references tblPeople (ID)
, PhoneNumberTypeID long not null
references tblPhoneNumberTypes (ID)
, PhoneNumberID long not null
references tblPhoneNumbers (ID)
, constraint People_to_PhoneNumberTypes_to_PhoneNumbers_PK
primary key (
PersonID
, PhoneNumberTypeID
, PhoneNumberID
)
)
這裏的每個人(因此每個客戶和每個緊急聯繫人)可以有任意數量的任意類型的電話號碼。因此,這實際上是一個多對多到多個鏈接表。我相信這是你的聯繫電話型電話號碼模式的關鍵(或者讓我們說'祕密')。
在像上面這樣的鏈接表中,我更喜歡使用多列主鍵,因爲我覺得整數主鍵列沒有用處。在這裏,主鍵強制實施這樣的事實:每個人員和電話號碼組合應該僅列出一次,並且具有一個電話號碼類型。
請注意,以上都是有效的Access ANSI-92 SQL。
非常感謝你這麼徹底的回答!這正是我所期待的。我想按照這本書去閱讀,因爲我將它作爲一個更復雜的數據庫的練習,我將爲我的日常工作建立一個更復雜的數據庫。但你絕對是對的 - 我會牢記大局。 – intruesiive