分类广告网站的数据库结构

时间:2011-08-29 10:15:36

标签: mysql database-design solr faceted-search

我正在开发类似于Quickr.com的分类广告网站。

主要问题是每个类别都需要一组不同的属性。例如,对于移动电话,属性可能是制造商,操作系统,是触摸屏,是否启用3G等...而对于公寓,属性是卧室数量,配备,哪个楼层,总面积等。属性和属性数量因每个类别而异,我将属性及其值保存在不同的表中。

我当前的数据库结构是

表classifieds_ads

此表存储所有广告。每个广告一个记录。

ad_id
ad_title
ad_desc
ad_created_on
CAT_ID

示例数据

-----------------------------------------------------------------------------------------------
|ad_id | ad_title    | ad_desc                                       | ad_created_on | cat_id |
-----------------------------------------------------------------------------------------------
|1     | Nokia Phone | Nokia n97 phone for sale. Excellent condition | <timestamp>   | 2      |
-----------------------------------------------------------------------------------------------

表classifieds_cat

此表存储所有可用类别。 classifieds_ads表中的cat_id与此表中的cat_id相关。

CAT_ID信息
类别
parent_cid

示例数据

-------------------------------------------
|cat_id| category            | parent_cid |
-------------------------------------------
|1     | Electronics         | NULL       |
|2     | Mobile Phone        | 1          |
|3     | Apartments          | NULL       |
|4     | Apartments - Sale   | 3          |
-------------------------------------------

表classifieds_attribute

此表包含特定类别的所有可用属性。与classifieds_cat表有关。

attr_id
CAT_ID
INPUT_TYPE
attr_label
attr_name

示例数据

-----------------------------------------------------------
|attr_id | cat_id | attr_label       | attr_name          |
-----------------------------------------------------------
|1       | 2      | Operating System | Operating_System   |
|2       | 2      | Is Touch Screen  | Touch_Screen       |
|3       | 2      | Manufacturer     | Manufacturer       |
|4       | 3      | Bedrooms         | Bedrooms           |
|5       | 3      | Total Area       | Area               |
|6       | 3      | Posted By        | Posted_By          |
-----------------------------------------------------------

表classifieds_attr_value

此表存储classifieds_ads表中每个广告的属性值。

attr_val_id attr_id ad_id attr_val

示例数据

---------------------------------------------
|attr_val_id | attr_id | ad_id | attr_val   |
---------------------------------------------
|1           | 1       | 1     | Symbian OS |
|2           | 2       | 1     | 1          |
|3           | 3       | 1     | Nokia      |
---------------------------------------------

======

  • 这个设计好吗?
  • 是否可以使用solr索引此数据?
  • 如何对此数据执行分面搜索?
  • MySQL是否支持字段崩溃,如solr?

2 个答案:

答案 0 :(得分:2)

我的建议是从cat_id表中删除classifieds_attribute,然后创建一个新表。

新表格如下:

cat_attr | id | cat_id | attr_id

这可以帮助您减少冗余。

答案 1 :(得分:1)

您的设计很好,但我质疑您使用分层类别的原因。我知道您希望从最终用户的角度组织类别。层次结构可帮助他们深入查找他们要查找的类别。但是,您的架构允许每个级别的属性值。我建议您只需要(或可能需要)叶级别的属性。

您当然可以提出适用于更高级别的属性,但这会极大地使您对数据的管理变得复杂,因为您不得不花费大量时间来考虑确切的高度。链属于某个属性属性以及是否有某种原因导致较低级别可能是父规则的异常等等。

它也肯定会使你的检索变得复杂 - 我认为这是你问题的部分原因。

我建议创建一个额外的表,用于管理叶级以上的类别层次结构。它看起来与您的classifieds_cat表格完全相同,除了复杂的关系显然是新表格。然后classifieds_cat.parent_cid成为新表格的FK,而不是classifieds_cat的复制FK。

我认为这种架构更改会降低您的应用程序和数据管理的复杂性。