【问题标题】:One to Many relationship table in MySQLMySQL中的一对多关系表
【发布时间】:2026-02-10 16:05:01
【问题描述】:

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

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;

编辑:

我的问题是。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    餐桌设计:

    Property
        ID
        TransactionType_ID
    
    TransactionType
        ID
    
    Category
        ID
    

    这是inheritance structure顺便说一句

    SubCategory
        ID
        CategoryID
        Name
    
    Property_Category_List
        PropertyID
        CategoryID
    
    Property_SubCategory_List
        PropertyID
        SubCategoryID
    

    我认为有一种方法可以清理类别/子类别,但我暂时想不到,这真的取决于业务规则。

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

    【讨论】:

    • 是的,继承结构可能很棒,但不符合我的要求。因为一个属性只能联系一个transactionType一个类别和一个子类别。所有从根事务继承到类别到子类别。你给了我一个关于我应该如何去的更好的想法的链接。谢谢。:)
    • 总是很乐意提供帮助,即使是间接的 :) 另外,如果您喜欢另一篇文章,请记得点赞,因为帮助他们总是很好,即使比他们晚得多原帖。
    【解决方案2】:

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

    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(这是subcategory.id 的FK)

    【讨论】:

    • 是的,我对所有表都使用了外键约束,这是我决定使用 InnoDB 的主要原因,因为它支持外键。我早先采用了这种方法。我认为我应该坚持下去,因为任何子类别都会与财产有多对一的关系。