如何在MySQL表中创建具有不同选项的分类?

3
我希望在MySQL中设计一个关于类别选项的数据库。例如:分类脚本... 当您想要将广告添加到“汽车类别”时,必须添加一些此汽车的选项,但是当您在“待售公寓类别”中添加广告时,必须为此公寓添加某些选项,例如Dubizzle网站上的这张图片说明了分类广告。当您想要在“汽车类别”中添加车辆时,您将显示这些选项,而当您想要在“待售公寓类别”中添加广告时,您将显示这些选项。我该如何设计这样的数据库呢?
categories and sub-categories with different options for any categories
4个回答

2
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
);

外键约束用于防止破坏表之间链接的操作。

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


分类的选项表在哪里? - Golden Fingers
将 subCat 重命名为 options。 - Drew
你说的“FK”是什么意思? - Golden Fingers
外键约束 - Drew

1

分类

首先,您需要定义您的分类表,如 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)


1
@Taha,有很多更简单的方法,但简单并不一定更好。我建议创建5个表格,这是一次性的工作,然后您可以实现所需的功能。如果您简化解决方案,您可能不再处于正常形式,并且由于数据和问题空间的内在复杂性,您未来的自己可能需要重新考虑方法,如果您过度简化。因此,虽然想要一个简单的解决方案很正常,但您需要仔细思考需要表示哪些内容以及哪个表格似乎是不必要的。 - Lajos Arpad
1
@Taha请阅读有关数据库规范化的内容,以解决由于数据冗余和不一致性而引起的问题:https://en.wikipedia.org/wiki/Database_normalization - Lajos Arpad
您没有提及如何在广告表本身中包含选项。 - Taha Sami
1
@Taha确实,我的回答主要关注广告分类,并没有涉及广告表,感谢您的观察。有几种可能的解决方案。一个简单的解决方案是在广告表中添加category_id字段,然后支持单个类别。一个不太简单但更好的解决方案是创建一个ad_categories(id,ad_id,category_id)表,该表将具有表示广告具有类别的记录。后一种方法将支持广告具有多个类别的情况。 - Lajos Arpad
1
@Taha 另一个需要处理的问题是基于控制项存储广告的多个选择。这可以通过创建一个 ad_items 表来实现,其中每个记录都代表特定广告的一个项目,并具有 ad_id 外键。 - Lajos Arpad
显示剩余3条评论

0

分类_子类_选项卡:

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

选项:

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

2
你的回答可以通过提供额外的支持信息来改善。请[编辑]以添加更多细节,如引用或文档,以便他人可以确认您的答案是否正确。您可以在帮助中心中找到有关编写好答案的更多信息。 - Community

0

这是一个动态方案,首先您需要定义您的类别、控件(文本、下拉框等),然后您需要定义类别字段,其中包含类别ID、字段信息等,并且您需要为类型下拉框等定义字段值表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接