高效的分类Mysql结构

时间:2009-12-18 06:56:51

标签: mysql architecture

我正在重组分类MySQL数据库,其中不同的主要部分被分成不同的表。例如,销售商品拥有自己的具有唯一ID的表,工作具有自己的具有唯一ID的表,个人也有自己的表。

这些部分都有一些共同特征:

-id
-title
体区
- 列出状态
-poster
-reply email
- 提交日期

但他们每个人都需要一些单独的信​​息:

- 每个都有不同的类别和树类可供选择(这会影响存储它们所需的结构)
-jobs需要存储工资,开始日期等内容 - 销售商品需要存储价格,敖包等商品。

因此,重构数据库是一种更好的做法,而我可以通过通用表存储所有常规列表信息而不管部分,然后将自定义数据存储任务分配到小表,或者最好离开单独的当前结构并将这些部分分开?

2 个答案:

答案 0 :(得分:2)

听起来他们都是彼此无关的独立实体(ecxept用于共享某些列定义),对吗?

您是否想要像

那样进行SELECT
SELECT *
FROM main_entity
WHERE entity_type IN ('SALE_ITEM', 'JOB', 'PERSONAL')?

否则我认为我不会将它们合并到一个表中。

答案 1 :(得分:0)

不要使用单个表格。走向关系。

我建议设置的是“主”表(具有共同特征的表)和包含特定信息的三个表之间的所谓多态关系。结构看起来像这样:

主要表格

  • ID
  • 标题
  • ...
  • category_name(VARCHAR或CHAR)
  • category_id(INTEGER)

类别表

  • ID
  • (特定栏目)

category_name字段应包含特定类别表的表名,例如。 'job_category',而category_id应指向类别表中的ID。一个例子如下:

# MAIN TABLE
id  | title         | ... | category_name | category_id
-------------------------------------------------------
123 | Some title    | ... | job_category  | 345
321 | Another title | ... | sale_category | 543

# SPECIFIC TABLE (job_category)
id  | ...
---------
345 | ...

# SPECIFIC TABLE (sale_category)
id  | ...
---------
543 | ...

现在,无论何时查询主表,您都会立即知道要从中获取其他数据的表,并且您将知道该表中的ID。这种方法的唯一缺点是您必须执行两个单独的查询来获取单个项目的信息。但是,在交易中可能会这样做。

另一方面,如果以相反的方式获取数据(例如,您在jobs_category中搜索某些内容),则可以使用JOIN从主表中获取关联数据。请记住,不仅要加入main.category_id = jobs_category.id,还要使用category_name列作为连接条件。否则,您可以获取属于其他类别之一的数据。

为获得最佳性能,您可能希望索引category_name和category_id列。这将主要加速连接两个表的任何查询,如上一段所述。

希望这有帮助!