【问题标题】:How can I create categories with different options of it in mysql tables如何在 mysql 表中创建具有不同选项的类别
【发布时间】:2015-09-19 10:30:11
【问题描述】:

我想在 MySQL 中设计一个带有类别选项的类别数据库。

示例:脚本分类..

当您想在“汽车类别”中添加广告时,您必须为此汽车添加一些选项,但是当您在“待售公寓类别”中添加广告时,您必须为此公寓添加一些选项,例如,此图片来自 Dubizzle 网站的说明为分类。

当您想在“汽车类别”中添加汽车时,您会显示这些选项

当您想在“待售公寓类别”中添加广告时 您将显示以下选项:

我该如何设计这样的数据库?

categories and sub-categories with different options for any categories

【问题讨论】:

    标签: mysql database-design


    【解决方案1】:
    create table category
    (
        id int auto_increment primary key,
        catName varchar(100) not null
    );
    
    create table catOption
    (   -- no attempt to share option across multiple categories
        id int auto_increment primary key,
        catId int not null,
        descr varchar(100) not null,
        listingOrder int not null   -- order listed on screen
    
        -- include FK into category
    );
    
    create table listing
    (
        id int auto_increment primary key,
        catId int not null,
        title varchar(100) not null,
        verbeage text,
        price decimal(12,0) not null
    
        -- include FK into category
    );
    
    create table listOptions
    (   -- this table houses a particular listing options (answers if you will)
        -- programmer chooses whether or not to save 'blanks'
        id int auto_increment primary key,
        listingId int not null,
        optionId int not null,
        answer varchar(100) not null    -- you choose datatype
        -- include FK into listing
        -- include FK into catOption
    );
    

    FOREIGN KEY 约束用于防止可能会导致 销毁表之间的链接。

    FOREIGN KEY 约束还可以防止无效数据 插入到外键列中,因为它必须是 它指向的表中包含的值。

    【讨论】:

    • 类别的选项表在哪里?
    • 将 subCat 重命名为 options
    • “FK”是什么意思?
    • 外键约束
    【解决方案2】:

    类别

    首先,您需要定义您的类别表,例如 categories(id, name, description)

    控件类型

    正如我们从您分享的图片中看到的那样,有时您有一组复选框,有时您有下拉选项等。为了支持这一点,您需要一个类似 control_types(id, name, description 的表格)。在您的应用程序中,您将通过控件类型值知道需要使用什么控件以及应该如何理解选择。

    控件

    现在,您可以创建控件,如下所示:controls(id, control_type_id, title)。请注意,我们在此表中没有category_id,因为我们希望能够支持在多个类别中重用某些控件的可能性,只要它们与这些控件兼容。例如,这两个类别都需要您拥有的price 控件。所以假设每个控件都链接到一个类别是不够的,相反,一个类别可以有多个控件,一个控件可能属于多个类别。

    类别控制

    为了实现上一章中描述的多对多关系,我们创建了一个存储对的表:controls_of_categories(id, category_id, control_id)

    控制项

    很高兴我们拥有这些控件,但有时它们并非微不足道。有时我们需要从某些选项(下拉菜单)中选择一个值,或者我们可能需要能够同时选择多个选项(复选框)。为此,我们需要另一个表,如下所示:control_items(id, control_id, label, value)

    【讨论】:

    • 我是同一个人,但我无法对该帐户发表评论。这样,我们需要创建很多表,可能有更简单的方法
    • @Taha 有很多更简单的方法,但更简单不一定更好。我建议创建 5 个表,这是一次性的工作,然后您可以实现所需的功能。如果您简化解决方案,您可能不再处于正常形式,并且由于您的数据和问题空间的内在复杂性,如果您过度简化,您未来的自己可能不得不重新考虑您的方法。因此,虽然想要一个简单的解决方案是正常的,但您需要考虑需要表示什么以及似乎不需要哪个表。
    • @Taha 请阅读有关数据库规范化的信息,以解决由于数据冗余和不一致引起的问题:en.wikipedia.org/wiki/Database_normalization
    • @Taha 确实,我的回答主要集中在广告的分类上,并没有解决广告表,感谢您的观察。有几种可能的解决方案。一个简单的解决方案是在 ads 表中有一个 category_id 字段,然后支持单个类别。一个不太简单但更好的解决方案是有一个 ad_categories(id, ad_id, category_id) 表,其中包含表示广告具有类别的记录。后一种方法将支持广告具有多个类别的情况。
    • @Taha 要处理的另一个问题是根据 control_items 存储多个广告选择。这可以通过创建 ad_items 表来实现,该表的每条记录将代表特定广告的一个项目,具有 ad_id 外键。
    【解决方案3】:

    Category_sub_category_tab:

    CId PK
    ,CName Text
    ,SubCatId FK(Category_sub_category_tab(CId))
    

    选项

    ID PK
    ,OName Text
    ,CID FK(Category_sub_category_tab(CId))
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案4】:

    这是一个动态方案,首先您必须定义类别、控件(文本、下拉列表等)然后您必须定义 categoryFields 这将包含 categoryId、字段信息.. 并且您必须定义字段值表对于类型下拉列表和类似的东西

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      相关资源
      最近更新 更多