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

Joy*_*abu 5 mysql database-design solr faceted-search

我正在开发类似于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      |
-----------------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

表classifieds_cat

该表存储所有可用类别。分类目录广告中的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          |
-------------------------------------------
Run Code Online (Sandbox Code Playgroud)

表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          |
-----------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

表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      |
---------------------------------------------
Run Code Online (Sandbox Code Playgroud)

========

  • 这个设计好吗?
  • 是否可以使用solr索引此数据?
  • 如何对该数据执行多面搜索?
  • MySQL是否像solr一样支持字段折叠?

Joe*_*own 1

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

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

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

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

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