繁体   English   中英

MySQL中的一对多关系表

[英]One to Many relationship table in 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)

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

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;

编辑:

我的问题是。

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

如果子类别属于一个类别,则应使用外键约束强制执行:

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

这一切都取决于类型的业务规则。 我对以下建议采取了一些规则,如果有任何错误,请告诉我:

  • 属性只能有一种事务类型
  • 一个属性可以有多个类别
  • 属性可以有多个子类别
  • 一个类别不能与其他类别共享其子类别(即。(我知道这有点做作)如果你想要在Residential下面的Residential_ZZZ子类别,那么你必须创建一个全新的子类别,如果你想要一个同名的子类别( Residential_ZZZ)商业广告。)

表设计:

Property
    ID
    TransactionType_ID

TransactionType
    ID

Category
    ID

这是btw的继承结构

SubCategory
    ID
    CategoryID
    Name

Property_Category_List
    PropertyID
    CategoryID

Property_SubCategory_List
    PropertyID
    SubCategoryID

我认为有一种方法可以清理类别/子类别,但我现在想不到它,它实际上取决于业务规则。

在您当前的架构下,您至少需要一种方法将子类别与其现有类别联系起来(通过包含CategoryID完成上述。此外,您的属性只能有一个类别和子类别,因为它们只有一个列如果你计划有多个类别或子类别,那么你需要我在最后两个表中创建的列表/地图结构。这是这里唯一的两个主要变化

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM