2012-03-10 188 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