2016-09-17 18 views
1

我正試圖找到最近遇到的問題的最佳解決方案。我討厭沒有理解的事情,所以我希望有人可以幫忙。自動編號與主鍵的文本字符串?

我有一個存儲酒店信息表的Access數據庫 - 然後是存儲行程的另一個表。行程表將從酒店列表中的酒店列表中選擇。

我想要建立適當的關係,但在連接到Itineraries表上的Hotels字段的Hotels表上使用Autonumber主鍵不起作用。 (因爲自動編號ID不匹配的酒店名稱)

是更好地:

A.使用酒店的名字作爲酒店表的主鍵,即使字符串的長度可能會變得相當長?

B.將Itineraries表上的Hotels字段的顯示控件更改爲列出Hotels表自動編號主鍵的組合框 - 但將其隱藏。相反,它會顯示帶有酒店名稱的列。我發現這裏的解決方案:http://www.trigonblue.com/accesslookup.htm

這兩個解決方案都不完美,因爲我認爲解決方案A可能會減慢長文本字符串的索引,並且如果在表中插入新字段,解決方案B會變得混亂。

我不想在這裏選錯了答案,並在路上遇到問題。

任何人都可以幫助我嗎?如果我需要澄清我的問題的任何部分,請讓我知道。

謝謝!

+0

您仍然可以添加酒店,並使用酒店ID路線之間的關係 - 只需添加一個索引長fiedl「HotelID」的路線與「允許重複」 - 遠遠超過鏈接到酒店名稱 – dbmitch

+0

感謝您的答覆更好。對不起,我是一個新手,也許不理解 - 那麼酒店ID是否會成爲Itineraries字段上的一個數字?我不知道哪些自動編號對應於酒店名稱 – arbitel

+0

爲了回答您的問題,您的選擇B是要走的路!其最安全和推薦的方式:) 原因:你使用的鑰匙,只有鑰匙! :) :) –

回答

1

自動編號是設置主鍵的最有效方式,它是DBMS通過搜索找到所需內容最少的工作。如果您要在表中使用主鍵/外鍵關係,則尤其如此。

更不用說,爲了存儲目的和索引目的,這樣做有好處(對Access沒有什麼大不了的,但在其他的方面會是這樣)。

+0

感謝您的回覆 - 選項B在這裏最好嗎?或者還有另一種方法,我仍然可以使用自動編號建立關係? – arbitel

+1

不知道爲什麼你認爲「*如果在表格中插入新字段,*解決方案B會搞砸*」這是正確的方法 - 您只需更改組合框來對酒店名稱進行排序 - 不會出現混亂在顯示器上。您仍然可以添加酒店名稱的索引,以便快速進行排序 – dbmitch

+0

該解決方案的唯一方法是選擇「列數」和「列寬」。所以說Key是第1列,而你想要的顯示是第2列。你將查找工具設置爲2列,並將寬度設置爲0「; 1」。如果您在第二列之前插入了新字段,則會顯示。 我的意思是,我想我可以記住不插入字段,但似乎應該有更好的方法。 – arbitel

1

您幾乎從不使用名稱作爲主鍵。使用CODEID形式的唯一ID是一種更安全的方法。避免使用名稱的,您可以:

  • 摘要從標識符
  • 儲存在單一位置
  • 更改名稱,名稱名稱,如果需要的話,在一個位置
  • 使用更少磁盤空間和內存。
  • 執行更快的索引,插入,刪除,連接,排序和分組。

有時您已經擁有代碼或ID,或者受到內部/外部規則的約束,但大多數時候AutoNumbered主鍵非常有用。它是:

  • 數字,所以它有效地存儲
  • 數字,所以它的快速與
  • 保證是唯一
  • 新條目總是在表的末尾插入,只需要最少的努力工作用於頁面移動或索引更改。
+0

「保證是唯一的」 - 嗯,自動編號可以重新調整爲1,以便新行將生成重複項。此外,您可以更新具有autonumber屬性的列以故意創建重複項。您聲明的保證僅限於主鍵,與AutoNumber無關。 – onedaywhen

+0

除了這是訪問。使用DDL可能會使用種子,但它[不推薦](http://superuser.com/questions/288087/how-do-i-set-the-first-value-of-autonumber-in-access #comment301363_288087) – ThunderFrame

+0

「新條目始終插入表的末尾」 - 對於任何表都可以這樣說,無論它是否有自動編號和/或主鍵。我認爲你的意思是,如果自動編號是增量的(不是隨機的)並且沒有達到最大值,那麼當文件被壓縮時,磁盤上的物理順序不會改變,因爲PK決定了聚集索引。這是一個可疑的優勢,因爲最近創建的行通常會存在爭用:如果它們位於同一物理頁面上,那麼您可能會遇到鎖定問題。隨機自動編號可能會更好。 – onedaywhen