繁体   English   中英

可以改进此MySQL数据库还是它本身是好的?

[英]Can this MySQL db be improved or is it good as it is?

在分类广告网站中,您有几个类别(汽车,汽车,房屋等)。 对于选择的每个类别,隐藏的div都会变为可见,并显示用户可以根据需要指定的其他选项。

我现在正在创建一个数据库,并且我已经阅读了一些有关规范化和使其优化的文章。

这是我今天的上篮时间

类别表:
- 汽车
-MC
-房屋

分类表:
-标题
-说明
-hide_telephone_nr
-多变
-动作
- 价钱
-修改日期

海报桌:
- 名称
-密码
-电话
-电子邮件

面积表:
-面积
-社区

车表:
- 年
- 汽油
-变速箱
-颜色

MC表:
- 年
-类型

房子表:
-别墅
-公寓
-大小
-房间
等等

到目前为止,每个类别都有一张桌子,因此大约有30张桌子。 是不是太多了?

到目前为止,我还没有为其中任何一个创建PK或FK,还没有那么远...

您能告诉我这个设置是否不错,还是应该改用其他设置?

另外,您将如何在此处设置FK和PK?

谢谢

根据我的理解,我将为所有类别创建一个表格,并在其中存储类别的名称和ID。 接下来,我将创建一个单独的表来存储每个类别的其他选项。

MySQL Table 1  
----------------   
Category_ID int PRIMARY KEY  
Category_name varchar  

MySQL Table 2  
---------------- 
Category_ID int   
Entry_Number int PRIMARY KEY (this will keep track of which entry everything belongs to)
Additional_Option varchar  
Additional_Option_Answer varchar (this is the one that stores what your user clicks/inputs)

例如,使用:

POSTER TABLE:
- name
- passw
- tel
- email

你会在这CATEGORY_ID数据是在存储Category_ID和商店name passw tel emailAdditional_Option在它自己的行以及用户对这些标准输入将被存储在Additional_Option_Answer

Posters Category_ID为1, Area ID为2。

如果第一个用户添加了一些内容,它将看起来像这样:

---------------------------------------------------------------------------------------------
Category_ID   |    Entry_Number    |    Additional_Options   |   Additional_Options_Answers
---------------------------------------------------------------------------------------------
       1      |   1                |    name                 |   doug
       1      |   1                |    passw                |   1234

如果第二个用户添加了一些内容,它将看起来像这样:

---------------------------------------------------------------------------------------------
Category_ID   |    Entry_Number    |    Additional_Options   |   Additional_Options_Answers
---------------------------------------------------------------------------------------------
       1      |   2                |    name                 |   Hamlet
       1      |   2                |    passw                |   iliketurtles

此外,让我们应用另一个类别:

AREA TABLE:
- area
- community

---------------------------------------------------------------------------------------------
    Category_ID   |    Entry_Number    |    Additional_Options   |   Additional_Options_Answers
    ---------------------------------------------------------------------------------------------
           2      |   3                |    area                 |   San Francisco
           2      |   3                |    community            |   community_name

您可以通过使用表名称中的数据来识别类别表的问题。 每个类别都有表的问题主要不是因为您有很多表,而是如果添加另一个类别,则必须更改数据库设计。 另外,当您需要基于数据选择表时,查询数据库很困难。

对于发布属性,您应该有一个表格,而不是每个类别一个。 由于每个类别的属性不同,因此您还需要一个表来描述每个类别使用的属性。

描述主要对象(类别,分类,张贴者,区域,属性)的表将获得主键。 其他表仅需要外键,因为它们是对象之间的关系。

Category (CategoryId, CategoryName)

Classified (ClassifiedId, PosterId, AreaId, ...)

Poster (PosterId, ...)

Area (AreaId, AreaName, ...)

Property (PropertyId, PropertyName)

CategoryProperty (CategoryId, PropertyId)

ClassifiedProperty (ClassifiedId, PropertyId, Value)

首先,您需要为每个表创建主键。 通常,执行此操作的最佳方法是使用名为id或tablenameId的顺序ID字段。 这真的很重要。 绑定到实际数据的主键将在数据更改时引起问题。

category (id PK, name)
category_options (id PK, category_id FK->category.id, option_name)

这样该类别表将具有类似

(1, car)
(2, MC)

和选项将具有像

(1, 1, year)
(2, 1, fuel)
(3, 2, type)

然后,您需要一个表,在该表中实际存储值并将其链接到项目。 这仅要求您在查询一项时将所有3个类别表联接在一起。

category_values (id PK, category_options_id FK-> category_options.id, value, classified_id FK->classified.id)

分类表需要fk到发帖人和id字段。

classified (id PK, poster_id FK->poster.id, headline, description, hide_telephone_nr, changeable, action, price, modify_date)

Poster表非常好,因为它只是为主键添加了ID字段。 我只是认为通常称为用户。

通过category_options_id FK-> category_options.id,我的意思是category_options_id应该具有对category_options.id的外键引用。

您可以进行更多的归一化操作,例如分类信息(classified.action)和分类信息(classified.changeable),但这也会增加复杂性。

我希望这有帮助。

我还必须强调,这不是唯一可行的解​​决方案,根据您实际想要使用数据的方式,它可能不是最佳选择,但它确实可行,而且效果还不错:)

您的设计与底层产品密切相关。 另外,您要将看起来互斥的数据放在不同的列中(例如,确定房屋既不能同时是别墅又不能是公寓吗?)我将采用更为通用的形式,例如:

Category 
Classified
Poster

与OP中相同,但添加/声明了主键。

然后将所有类别特定的属性分组到一个表中,例如

Std_Tags {id, category, tag}
{0,Cars,year}
{1,Cars,fuel}
{2,house,type}
{3,house,rooms}

在另一个表中带有值:

classified_tags {std_tags_id, classified_id, value}
{0,13356,2005}
{2,109,villa}
{0,153356,diesel}

通过添加如下表,这也简化了输入表单的构建,因为模板也被明确声明:

Allowed_values {std_tags_id, value}
{1,diesel}
{1,petrol}
{1,LPG}
{2,Villa}
{2,Apartment}

然后,可以使用符合标准搜索的下拉列表完成许多数据输入。

C。

暂无
暂无

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

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