2013-03-09 29 views
0

我使用CakePHP 2和MySQL創建了一個相對簡單的應用程序。在這種情況下實現關係並實施數據庫完整性的最佳方式?

該應用程序有Users,主要有Admin用戶誰有權訪問管理面板。

然後有CustomersCustomers可以填寫註冊表。只有一次的Customer已批准由Admin用戶,對於Customer創建的用戶記錄,因此客戶可以登錄。

很顯然,我需要存儲的UserIDCustomerID,這樣我就可以與用戶記錄相關聯Customer記錄。

這是否意味着我需要第三個表格,只包含UserIDCustomerID,我只在Customer獲得批准後才填充該表格?

編輯:只需要添加,目前,每個「客戶」只有1'用戶',所以1:1的關係。

+0

難道你不能在你的'users'表上有'customer_id'字段嗎? (沒關係,我沒有在帖子正文中看到你的問題) – 2013-03-09 17:19:21

回答

0

如果我正確理解你的問題,你已經在你的數據庫中的兩個表:

UsersUserID, Name, AccessRights

CustomersCustomerID, Name, OtherSTuff

現在要創建這些表之間的關係。這裏要問的問題是:單個客戶可能存在多少個用戶,以及有多少客戶可能與任何給定用戶有關。

我個人猜測,單個客戶可能有多個員工訪問您的數據庫,但每個(非管理員)用戶只會與一個客戶關聯。這將是一個1:N的關係:1個客戶有N個用戶。要相應地更改數據庫模型,只需在Users表中的CustomerID列。

如果我的猜測錯了,1個用戶有N個客戶:一個用戶訪問多個客戶,則需要Customers表中的UserID列。

唯一的時候,你永遠需要一個第三表點是當N的客戶有M個用戶,這意味着:當一個用戶可以訪問多個客戶單個客戶可以通過多個用戶訪問。

編輯:我完全省略了並強制執行數據庫完整性部分。

MySQL支持FOREIGN KEY子句 - 至少在與某些存儲引擎(如InnoDB)一起使用時,我認爲MyISAM仍然沒有。外鍵子句允許該列中的值匹配外表中的現有值或者是NULL。如果不需要此行爲,則需要將該列聲明爲NOT NULL

您可以設置您的用戶,以便管理員擁有CustomerIDNULL,而常規用戶的設置爲CustomerID。但有一個問題需要解決:確保您不使用ON DELETE SET NULL條款,否則刪除客戶將使相應的用戶成爲管理員。改爲使用ON DELETE CASCASE

+0

抱歉,我應該在我的問題中明確表示,目前這是1:1關係,每個客戶只能獲得1個用戶。 我最初認爲我可以在用戶表中放置一個CustomerID,但對於管理員用戶來說,CustomerID是NULL,所以我不能強制關係的完整性,對嗎? – 2013-03-09 18:03:52

+0

您可以在具有NULL值的列上使用InnoDB的FOREIGN KEY子句。只有一個問題:不要使用ON DELETE SET NULL子句,否則刪除一個客戶將使相應的用戶成爲管理員。改用ON DELETE CASCASE。 – Hazzit 2013-03-09 18:25:03

+0

非常好,那正是我需要的。感謝Hazzit。我是否應該將您的答案標記爲正確,還是您希望將您的評論轉移到單獨的帖子中,然後將其標記爲答案? – 2013-03-09 20:12:33

相關問題