【问题标题】:Advice on structuring or normalizing my MySQL data needed关于结构化或规范化我的 MySQL 数据所需的建议
【发布时间】:2010-10-21 17:55:24
【问题描述】:

我正在构建一个 Web 应用程序,我刚刚从电子表格中的客户端收到了一些基本的基础数据。我需要以一种有意义的方式将数据放入 MySQL 数据库,以便以后可以有效地查询它。什么最有意义?详情如下:

有部门、类别 *edit(类别是产品类型,如男士 T 恤、女士牛仔裤等......)和供应商(最终是产品......)。 25 个部门、300 个班级和 3300 个供应商。在某些情况下,部门共享班级和供应商。

我的 Web 应用程序将具有部门页面,该页面将显示供应商列表,这些供应商的产品出现在所选部门中,并带有指向供应商特定页面的链接。供应商页面将按类别列出他们的产品。

我想我可以设置 3 或 4 个表,但这会在我构建应用程序时产生格式良好、高效的查询吗?此外,这是否会形成一个避免更新、删除异常的规范化数据库?

这实际上可能更多是关于如何选择我的数据而不是如何构建我的数据库的问题,但我认为我会从结构开始并转向查询优化。

【问题讨论】:

  • 那么类是产品的类别吗?
  • @Stephen,对不起。是的,类是产品类型,例如男士靴子、男士工作靴、女士时尚靴子等......

标签: mysql


【解决方案1】:

如果我正确假设类是产品的类别,并且产品可以属于单个类:

+================================+    +================================+
| departments                    |    | vendors                        |
+----+------+--------------------+    +----+------+--------------------+
| id | name | others             |    | id | name | others             |
+====+======+====================+    +====+======+====================+

+================================+    +================================+
| classes                        |    | products                       |
+----+------+--------------------+    +----+----------+----------------+
| id | name | others             |    | id | class_id | name | others  |
+====+======+====================+    +====+==========+================+

+================================+    +================================+
| departments_vendors            |    | classes_departments            |
+----+----------+----------------+    +----+---------------+-----------+
| id | department_id | vendor_id |    | id | department_id | class_id  |
+====+==========+================+    +====+===============+===========+

+================================+
| products_vendors               |
+----+------------+--------------+
| id | product_id | vendor_id    |
+====+============+==============+

如果产品可以属于多个类别,请删除 class_id 列并创建一个名为 classes_products 的新表。

假设上述结构,这里是一个示例查询。

获取一个部门、该部门的课程以及这些课程的产品:

SELECT    departments.id   AS DepartmentId,
          departments.name AS DepartmentName,
          classes.id       AS ClassId,
          classes.name     AS ClassName,
          products.id      AS ProductId,
          products.name    AS ProductName
FROM      departments
LEFT JOIN classes_departments
       ON classes_departments.department_id = departments.id
LEFT JOIN classes
       ON classes.id = classes_departments.class_id
LEFT JOIN products
       ON products.class_id = classes.id
WHERE     departments.id = ##

获取销售某个部门产品的供应商列表的最佳方法是制作另一个名为classes_vendors的表格

【讨论】:

  • 这建议创建 7 个表,对吗?这是数据可扩展性和规范化的最佳选择吗?对于我不确定的关系数据,我还很陌生。我只是想让它尽可能简单,这样我以后就不会遇到任何问题......
  • 根据我的经验,最简单的规范化应该关注对象和关系。您有DepartmentsVendorsProductsClasses 没有那么有形,但既然你有 300 个,它们应该在自己的桌子上。那是四个。然后你需要看看关系。对于 One->HasMany 关系,但是子表中父级的外键(Products 中的class_id)。对于可以以两种方式共享的特殊关系(称为 HABTM 或“拥有并属于多个”),例如部门和类,连接表是存储它的最佳/最简单的方式。
  • 我的关系可能并不完全符合您的想法。您需要制定每个对象的关联方式(也许产品可以有多个类,如果是这样,应该有一个新表来定义该 HABTM 关系)。在您了解了每个部分的关系之后,您就可以找出您需要的表格。
  • 实际上,CakePHP 文档中有一个关于关联模型的出色部分。您应该检查一下并将相同的技术应用于您的数据:book.cakephp.org/view/78/Associations-Linking-Models-Together 特别值得注意的是关系和模式部分
  • 优秀。谢谢你为我澄清,斯蒂芬。我很感激帮助。我需要解决这个问题并开始编码。你已经为我精心布置了。也非常感谢您提供查询示例。
猜你喜欢
  • 2011-05-12
  • 2011-01-31
  • 1970-01-01
  • 2011-05-02
  • 2013-08-21
  • 2018-03-12
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
相关资源
最近更新 更多