Ms-Access

在 MS Access 中需要幫助

  • July 13, 2017

我需要一些幫助。我在 access 和 dbs 方面相當新,並且已經取得了一些成就,但遇到了障礙。我不確定這是我的經驗不足還是訪問無法完成我想要的(或者這並不容易……)

無論如何,我需要建立一對夫妻關係。我有一些,但現在我的經驗水平太深了,無法弄清楚如何讓它做我想做的事。

基本上我需要記錄以下內容:

• 基礎/父契約 (BC)

  o    BC DOES have Line Items (CLINS)

  o    BC CAN have Modifications (Mods)

  o    BC CAN have Delivery Orders (DO)

• 交貨單 (DO)

  o    DO DOES have CLINS

  o    DO CAN have Mods

例子:

契約:F12345-D-17-0001

Delivery Order 0001

     CLIN 0001AA   

     CLIN 0002AA

Delivery Order 0002

     CLIN 0001AA

     CLIN 0002AA

     CLIN 0003AA

     Modification P00001

     **Modification P00002**

Modification P00001

Modification P00002

這些項目符號中的每一個都有自己的一組數據。契約編號本身是唯一的,但它的編號實際上會向下傳遞給每個其他人,因為它們被附加到它…… 例如,上面的 BOLD Mod 實際上會被列為“F12345-17-D-0001-0002-P00002”。在每個基礎合約下,Modifications、CLINs 和 Delivery Orders 基本上都是從 1 開始並增加,所以你可以看到會有很多相同編號的記錄,所以每個記錄使用不同的 ID 作為 key .

無論如何,我已經能夠建立這些關係:

Subordinate DO to Parent Contract

Subordinate Modification to Parent Contract

Subordinate CLIN to Parent Contract

POC Contact Info to Base Contract

我遇到的問題是關聯:(我認為因為它們是從屬於基本契約的第二層)

CLINs that go to Delivery Orders and 

Modifications that go to Delivery Orders

這一切都取決於基礎/父契約,並從那裡級聯下來。

這是我的關係表。 這是我的關係表

這就是我的表格的樣子——如果有幫助,我希望最終描繪的資訊如何。

這就是我的表格的樣子——如果有幫助,我希望最終描繪的資訊如何。

你會注意到我沒有提到每張桌子。希望當您開始了解正確的規範化模式時,這不是必需的。您應該能夠使用相同的模式分析和設置其他表上的關係。

進行這些更改後,您可能會發現您對獲取和顯示相關數據的正確方法有疑問,例如給定 CLIN 的契約號 - 特別是如果您按照我的建議消除了冗餘欄位。研究製作適當的查詢並將此類查詢用作表單和報告的記錄源等。有關此類查詢的進一步問題將需要新問題。此外,有關查詢細節和 SQL 的問題在 Stack Overflow 上可能更受歡迎。

  1. 這裡的總體原則應該是適當的數據庫規範化。儘管堅持每個級別的規範化通常不切實際或沒有必要,但它至少應該是最終表和關係結構的指南。這些概念可能有點抽象,但最好還是研究一下。
  2. 刪除重複的欄位,例如$$ CLIN Info Table $$.$$ Contract Number $$,$$ CLIN Info Table $$.$$ Delivery Order Number $$,$$ Delivery Order Table $$.$$ Contract Number $$等。關係數據庫的重點是始終通過關係獲取此類資訊。如果你想要一個$$ Contract Number $$對於給定的 CLIN,然後執行一個查詢,該查詢從正確的表中返回相關值。
  3. 查看現在定義的關係(在原始圖像中),您可以看到$$ Delivery Order Table $$和$$ Base Contract Data $$,但據我了解您的描述,這種關係是倒退的。您希望每個契約有多個傳遞訂單,而不是相反。
  • 對於這種關係,我建議1)刪除兩個表之間已有的關係;2) 消除$$ Base Contract Data $$.$$ Delivery Order ID $$; 3) 建立強制關係$$ Base Contract Data $$.$$ Contract ID $$(主鍵)到$$ Delivery Order Table $$.$$ Contract ID $$(外鍵)。
  1. 刪除$$ Delivery Order Table $$.$$ CLIN ID $$以消除混亂。
  2. 自從$$ CLIN Info Table $$將有記錄直接連結到$$ Base Contract Data $$並直接到$$ Delivery Order Table $$,那麼它需要有兩個獨立的“關係”。這可以通過至少兩種方式來實現。
  • 第一個方案涉及到有兩個外鍵$$ CLIN Info Table $$, 每個表一個。 該方案僅在單個$$ CLIN Info Table $$只能連結到一個$$ Delivery Order ID $$記錄或一個$$ Base Contract Data $$記錄。 如果我的評論問題的答案是完全相同的$$ CLIN Info Table $$可以連結到多個交貨單或聯繫人,那麼您需要跳到替代方案。

    • 您已經正確建立了其中之一:$$ CLIN Info Table $$.$$ Delivery Order ID $$(外鍵)已經相關$$ Delivery Order Table $$.$$ Delivery Order ID $$(首要的關鍵)。保持原樣。
    • 接下來刪除現有的關係$$ CLIN Info Table $$和$$ Base Contract Data $$並刪除$$ Base Contract Data $$.$$ CLIN ID $$. 你會注意到這與上面#2 中的錯誤關係類型相同。
    • 添加現有欄位之間的關係$$ Base Contract Data $$.$$ Contract ID $$(主鍵)到$$ CLIN Info Table $$.$$ Contract ID $$(外鍵)。
  • 替代方案滿足下一級標準化。如果完全相同,也可能需要$$ CLIN Info Table $$可以連結到多個其他表記錄。它需要第三個表來建立每個關係。它避免了具有多個空外鍵的問題。我確信這個話題可能會引起激烈的爭論,但我個人認為這只是一個偏好問題。在關係中添加第三個表必然會使查詢更加複雜。儘管此模式旨在消除某些其他關係問題,但它也建立了擁有孤兒記錄的能力,如果這是一個巨大的問題,您需要某種方式來管理這些問題。

    • 消除外鍵欄位$$ CLIN Info Table $$
    • 創建一個名為類似的新表$$ Oder CLIN $$只有兩個必填欄位: $$ Delivery Order ID $$和$$ CLIN ID $$. 您需要為這些欄位創建適當的索引,具體取決於您對相同的 CLIN 是否可以連結到不同的交貨單的回答。
    • 創建另一個名為類似的新表$$ Contract CLIN $$只有兩個必填欄位: $$ Contract ID $$和$$ CLIN ID $$. 您需要為這些欄位創建適當的索引,具體取決於您對相同 CLIN 是否可以連結到不同契約的回答。
    • 在新表中的外鍵與其對應的主表之間創建關係。

引用自:https://dba.stackexchange.com/questions/179775