这个MySQL数据库可以改进,还是很好?

时间:2010-01-20 08:41:31

标签: sql mysql database ms-access database-design

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

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

今天是我的上篮

类别表:
- 汽车
- mc
- 房子

分类表:
- 标题
- 说明
- hide_telephone_nr
- 可变的
- 行动
- 价格
- modify_date

海报表:
- 姓名
- passw
- 电话 - 电子邮件

区域表:
- 区域
- 社区

CARS TABLE:
- 年 - 燃料
- 变速箱
- 颜色

MC表:
- 年 - 输入

HOUSE TABLE:
- 别墅
- 公寓
- 尺寸
- 房间

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

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

你能否告诉我这个设置是否合适,还是我的设置不同?

另外,你如何在这里设置FK和PK?

由于

4 个答案:

答案 0 :(得分:1)

根据我的理解,我会为所有类别制作一个表格,并在那里存储类别的名称和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 email存储到Additional_Option的自己的行中用户对这些标准的输入将存储在Additional_Option_Answer

Posters的Category_ID为1,Area的Category_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

答案 1 :(得分:0)

您可以通过使用表名中的数据来识别类别表的问题。为每个类别设置表的问题主要不在于您获得了多个表,而是在添加其他类别时必须更改数据库设计。此外,当您需要根据数据选择表时,很难查询数据库。

您应该拥有发布属性的单个表,而不是每个类别的一个表。由于每个类别的属性不同,您还需要一个表来描述每个类别使用哪些属性。

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

Category (CategoryId, CategoryName)

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

Poster (PosterId, ...)

Area (AreaId, AreaName, ...)

Property (PropertyId, PropertyName)

CategoryProperty (CategoryId, PropertyId)

ClassifiedProperty (ClassifiedId, PropertyId, Value)

答案 2 :(得分:0)

首先,您需要为每个表创建主键。通常,执行此操作的最佳方法是使用名为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到poster和id字段。

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

海报表非常好,因为它只是为主键添加id字段。我只是认为它通常被称为用户。

按category_options_id FK-> category_options.id我的意思是category_options_id应该有category_options.id的外键引用。

你可以做更多的标准化,比如classified.action和classified.changeable,但它也增加了复杂性。

我希望这会有所帮助。

我还必须强调,这不是唯一可行的解​​决方案,取决于您实际想要如何使用数据,它可能不是最佳选择但它起作用并且至少是体面的:)

答案 3 :(得分:0)

您的设计与基础产品密切相关。你也把不同列中看似互斥的数据放在一起(例如,一个房子肯定不是别墅和aprtment?)我会选择一个更通用的形式,例如:

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}

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

下进行。