2009-12-18 32 views
0

我正在重组分类MySQL数据库,其中不同的主要部分分为不同的表格。例如,销售物品有自己的具有唯一ID的表格,作业有自己的具有唯一ID的表格,个人用户也有自己的表格。高效的分类的Mysql结构

这些部分都共享一些共同的特点:

-id
-title
体区
-listing状态
-poster
-reply电子邮件
-posting日期

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

- 每个类别都有不同的树和类别可供选择(它们会影响存储它们的结构)
-jobs需要存储诸如工资,开始日期等的东西
-sale物品需要存储类似价格,敖包等

因此,这是一个更好的做法重构数据库,而我可以通用表来存储所有常规列表信息,无论节,然后任务出定制数据存储到小表,或者更好地离开当前结构并将各部分分开?

回答

0

请勿使用单个表格。去关系。

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

主表

  • ID
  • 标题
  • ...
  • CATEGORY_NAME(VARCHAR或CHAR)
  • CATEGORY_ID(整数)

分类表

  • ID
  • (具体列)

对于类别字段应包含的具体类别表,例如表名。'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列。如前一段所述,这大多会加快加入这两个表的任何查询。

希望这会有所帮助!

2

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

你曾经想要做一个SELECT像

SELECT * 
FROM main_entity 
WHERE entity_type IN ('SALE_ITEM', 'JOB', 'PERSONAL')? 

否则,我不认为我会合并成一个表。