MySQL中的一对多关系表

时间:2012-03-10 15:16:48

标签: mysql database-design one-to-many

我正在为房地产应用程序设计数据库。申请的基本结构如下。

  

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)

我必须在属性和上面所有三个之间创建一个关系,以确定存储哪个属性,例如

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;

编辑:

我的问题是。

看到它们之间的关系,这是存储记录的正确方法吗?我主要关心的是类别和子类别表,因为现在我无法考虑将来可能发生的设计缺陷。我只是想知道如果你被告知要设计类似的东西,你将如何将记录存储在表中。主要是类别和子类别部分。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这完全取决于类型的业务规则。我假设以下建议有几条规则,如果有任何错误,请告诉我:

  • 属性只能有一种交易类型
  • 属性可以有多个类别
  • 属性可以有多个子类别
  • 一个类别不能与其他类别共享其子类别(即。(我知道这有点做作)如果你想在Residential下面的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完成上述操作。此外,您的属性只能有一个类别和子类别,因为它们只有属性中有一列。如果你计划有多个类别或子类别,那么你需要我在最后两个表中创建的列表/地图结构。这是这里唯一的两个主要变化