在分类广告网站中,您有几个类别(汽车,房车,房屋等)。 对于所选的每个类别,隐藏的div变为可见,并显示用户可能指定的其他选项。
我现在正在创建一个数据库,我已经阅读了一些关于规范化并使其优化的文章......
今天是我的上篮
类别表:
- 汽车
- mc
- 房子
分类表:
- 标题
- 说明
- hide_telephone_nr
- 可变的
- 行动
- 价格
- modify_date
海报表:
- 姓名
- passw
- 电话
- 电子邮件
区域表:
- 区域
- 社区
CARS TABLE:
- 年
- 燃料
- 变速箱
- 颜色
MC表:
- 年
- 输入
HOUSE TABLE:
- 别墅
- 公寓
- 尺寸
- 房间
等
到目前为止,每个类别都有一个表,因此大约有30个表。 是不是太多了?
到目前为止,我还没有为这些中的任何一个创建PK或FK,还没有那么远......
你能否告诉我这个设置是否合适,还是我的设置不同?
另外,你如何在这里设置FK和PK?
由于
答案 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}
然后,可以使用下拉列表完成大部分数据输入,符合标准搜索。
下进行。