5

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

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

我当前的数据库结构是

表分类广告

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

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      |
-----------------------------------------------------------------------------------------------

表分类s_cat

此表存储所有可用的类别。classes_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          |
-------------------------------------------

表分类_attribute

此表包含特定类别的所有可用属性。与分类s_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          |
-----------------------------------------------------------

表分类s_attr_value

该表将每个广告的属性值存储在分类广告表中。

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 一样的字段折叠?
4

2 回答 2

2

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

新表如下所示:

cat_attr | id | cat_id | attr_id

这应该可以帮助您减少冗余。

于 2012-12-07T18:26:57.493 回答
1

您的设计很好,尽管我质疑您为什么使用分层类别。我了解您希望从最终用户的角度来组织类别。层次结构帮助他们深入到他们正在寻找的类别。但是,您的架构允许每个级别的属性值。我建议您只需要(或可能需要)叶级别的属性。

您当然有可能提出适用于更高级别的属性,但这会使您的数据管理变得非常复杂,因为您必须花费大量时间来思考某个特定的链到底有多高属性所属以及是否有某些原因导致较低级别可能是父规则的例外等等。

当然,这也使您的检索变得过于复杂-我认为,这也是您提出问题的部分原因。

我建议创建一个附加表,用于管理叶级别以上的类别层次结构。它看起来和你的classifieds_cat表一模一样,除了内卷关系显然是新表。然后classifieds_cat.parent_cid成为新表的 FK,而不是 的内卷 FK classifieds_cat

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

于 2011-08-29T12:04:11.683 回答