2012-03-10 189 views
0

我正在爲房地產應用程序設計一個數據庫。該應用程序的基本結構如下。MySQL中的一對多關係表格

a)申請包括存儲與 房地產相關的記錄。

B)的特性被劃分成類別和交易類型 (出售,出租,租賃)等

c)中的類別被分成子類別。

以存在以下記錄爲例。

Transaction = Rent , Sale, Lease. 

Categories = Residential , Commercial , Industrial , Agricultural 

SubCategories = Residential_Apartment (belongs to residential category) 
       Villa/House (belongs to residential category) 
       Commercial_OfficeSpace (belongs to commercial category) 
       Commercial_Plot (belongs to commercial category) 
       Industrial_Plot (belongs to industrial category) 

我要創建的PROPERT和上述所有的三個確定哪些屬性之間的關係被存儲在例如

Property with id:1 is Transaction:Rent, Category:Residential, Subcategory:Villa/House 

Property with id:2 is Transaction:Sale, Category:Residential, Subcategory:Residential_Apartment 

Property with id:3 is Transaction:Lease, Category:Commercial, Subcategory:Commercial_Officespace 

我的當前表結構如下

CREATE TABLE IF NOT EXISTS `transaction` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `transactionName` varchar(30) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `category` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `categoryName` varchar(50) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `subcategory` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `subCategoryName` varchar(50) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `property` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(100) NOT NULL, 
    `transaction_id` int(11) NOT NULL, 
    `category_id` int(11) NOT NULL, 
    `subcategory_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

編輯:

我的問題是。

看到它們之間的關係,它是存儲記錄的正確方法嗎?我主要關心的是類別和子類別表,因爲現在我無法考慮將來可能發生的設計缺陷。我只想知道如果你被告知要設計類似的東西,你會如何在表中存儲記錄。主要是類別和子類別部分。

回答

1

這一切都取決於關於類型的業務規則。我假設一對夫婦的規則,下面的建議,如果有任何錯誤,請讓我知道:

  • 的屬性只能有一個交易類型
  • 屬性可以有多個類別
  • 的屬性可以有多個子類別
  • 如果你想要在住宅下的Residential_ZZZ子類別,那麼類別不能與其他類別共享其子類別(即,我知道這是有點人爲的設計),那麼如果你需要創建一個全新的子類別需要商業廣告中的同名(Residential_ZZZ)的子類別。)

表設計:

Property 
    ID 
    TransactionType_ID 

TransactionType 
    ID 

Category 
    ID 

這是一個inheritance structure BTW

SubCategory 
    ID 
    CategoryID 
    Name 

Property_Category_List 
    PropertyID 
    CategoryID 

Property_SubCategory_List 
    PropertyID 
    SubCategoryID 

我覺得有一種方法可以清理類別/子類,但我不能把它目前,這將取決於業務規則。

在你目前的模式下,你至少需要有一種方法來將子類別與其現有類別聯繫起來(以上通過包含CategoryID完成)。另外,你的屬性只能有一個類別和子類別,如果你計劃有多個類別或子類別,那麼你需要我在最後兩個表格中創建的列表/地圖結構,這是這裏唯一的兩個主要更改

+0

耶,繼承結構可能很好,但不是我要求的。因爲屬性只能聯繫一個transactionType一個類別和一個子類別。全部從根交易繼承到分類到子類別。你給了我一個關於我應該怎麼去的更好主意的鏈接。謝謝:) – 2012-03-10 18:50:30

+0

總是樂於提供幫助,即使它是間接的:)同樣,如果你喜歡那個,請記得點贊另一個帖子,因爲它總是很好地幫助他們,即使比他們原來的帖子晚得多。 – 2012-03-10 18:57:14

1

如果子類別屬於一類,應該與外鍵約束強制執行:

CREATE TABLE IF NOT EXISTS `subcategory` ( 
`id` int(11) NOT NULL AUTO_INCREMENT, 
`category_id` int not null, 
`subCategoryName` varchar(50) NOT NULL, 
PRIMARY KEY (`id`) , 
CONSTRAINT FK_subcategory_category_id FOREIGN KEY(category_id) 
REFERENCES category(id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

property表不應該有category_id,只是subcategory_id(這是FK到subcategory.id

+0

是的,我正在使用外鍵約束對我所有的表而言,這是我決定使用InnoDB的主要原因,因爲它支持外鍵支持,我之前採用了這種方法,我認爲我應該堅持這一點,因爲任何子類別與財產多對一的關係 – 2012-03-10 18:53:45