2010-07-09 109 views
0

我有一個表Costumers和另一個CostumersPayments設計數據庫 - 更好的方法

CostumersPayments我有付款的類型(MB,Visa,等等)。

我的問題是,每個客戶可以有多個付款,所以我不能創建一個名爲「IDPayment」的字段,我設置該付款的ID,並且我不知道付了多少付款有(管理員可以添加或刪除)。

您如何建議我在表Costumers中存儲付款ID?創建一個字段,我將它們存儲爲一個數組? (以逗號分隔的「1,2,3」)。

感謝

+1

它應該是客戶:) – 2010-07-09 11:29:30

+2

@Petar:也許他只賣戲劇costumers?這是可能的。 。 。 – 2010-07-09 11:58:05

回答

3

這基本上是一個many-to-many關係。一個客戶可以有多種支付類型,一種支付類型可以被許多客戶使用。只需要一張表Costumers,表PaymentTypes和表CostumersPayments。該表格將有兩列 - CostumerIDPaymentTypeID。這將是一個複合主鍵(兩列)。

CostumerPayments 

| CostumerId | PaymentTypeId | 
------------------------------ 
| 1   | 3    | 
| 1   | 4    | 
| 2   | 3    | 
| 2   | 5    | 
------------------------------ 

編輯:您在一排存儲ids的初始命題,用逗號隔開,在數據庫設計的最大的罪過之一。它甚至違反了第一種正常形式。請參閱here瞭解更多信息。

+0

正確,但請勿替代密鑰 – gbn 2010-07-09 11:31:25

+0

是的,這裏沒有必要。但在更復雜的情況下,它可能是:) – 2010-07-09 11:32:43

+0

一對多,每次付款只與一個客戶相關聯。 – pascal 2010-07-09 11:49:27

1

聽起來更像是,根據上面的描述,每個客戶都可以進行多次付款。

在這種情況下,Payments表只需要每行有CostumerID,當然?編輯: 你可能會想要3張桌子。 Costumers,Payments和PaymentTypes(我試圖明確表達我的表名)。

在PaymentTypes中,您有ID和名稱。在付款中,存儲CostumerID和PaymentTypeID。

+0

這是一種付款方式。一種支付類型可以從多個客戶使用。 – 2010-07-09 11:37:20

+0

啊,我現在明白了。我已經編輯了我的答案,以便更合適。 – 2010-07-09 12:35:41

1

創建一個字段,我存儲他們 像一個數組? (「1,2,3」由 逗號分隔)。

這打破了關係數據庫的normalization rules。千萬不要做這樣的事情。

0

您使用三張表。將客戶信息存儲在以CustomerId作爲主鍵的「客戶」表中。以PaymentId作爲主鍵將付款存儲在「付款」表中。然後使用一個名爲「CustomerPayments」的連接表,它具有CustomerId和PaymentId的主鍵。
您不應該在Customer表中將PaymentId作爲逗號分隔值存儲。這不是一個規範化的數據庫。請參閱http://en.wikipedia.org/wiki/First_normal_form

坦率地說,我希望您不負責根據您的經驗水平開發商業業務解決方案。

+1

您的技術建議非常好,正確。但我不認爲最後需要非構造性的評論 - 我們都必須在很多年前的某個地方學習,當時我第一次遇到這樣的設計問題,我希望有堆棧流問題。 – barrylloyd 2010-07-09 11:41:26

+3

抱歉,我不是故意批評這張海報,而是更多地看他的公司。隨着各種信用卡安全違規組織的出現,我希望這些公司有經驗豐富的人員來指導新的開發人員,而不是希望他們自己接受。安全是一件棘手的事情,後果非常嚴重。 – kanad 2010-07-09 11:49:19

0

只需在CostumersPayments中有一個CustomerID列,並將其作爲對Customer的引用。

如果您想檢索客戶的付款,只需加入表格即可。

1

首先,絕對不要像您提到的那樣在一個字段中存儲多個值。正如其他人所描述的,這是一個壞主意。

其次,我不清楚CostumerPayments表中包含什麼。這是客戶所做的個人付款(包括金額)嗎?這些付款中的每一個都有與之相關的付款類型?

如果這是你想要的下表中的情況:

  1. 的costumers,與CostumerID的主鍵,並在所有沒有提及支付。
  2. PaymentTypes,主鍵爲PaymentTypeID,不支持付款或客戶。
  3. CostumerPayments,CostumerID的外鍵指向Costumers表,第二個PaymentTypeID指向PaymentTypes表的外鍵。

要查找客戶的所有付款,請查看CostumerPayments表,其中CostumerID = <>。要在同一個查詢中獲取客戶信息和付款,請加入兩個表Costumers和CostumerPayments。要查找付款類型的正確名稱,請同時加入PaymentTypes表。

或者,如果您的目標是存儲允許每個客戶使用的PaymentType列表(而不是引用金額,只是允許客戶使用例如VISA卡的事實)添加一個表格:

CostumerAllowedPaymentTypes,帶有外鍵CostumerID和PaymentTypeID到它們各自的表中。