mysql - 数据库设计建议

标签 mysql laravel database-design relational-database database-schema

我计划拥有几张 table ,但我不太确定如何设计“整个事情”。 一些帮助将非常感激! :)

我基本上想模拟一个有食谱和配料的超市。 所以我在想:

  • 超市(名称)
  • 制造商(名称)<- 拥有多种产品
  • 产品(数量、单位、名称)<- 属于制造商
  • 金额(名称)<- 以产品金额为基准
  • 单位(名称)<- 以产品单位为中心
  • 成分(名称、产品)<- 以产品为中心

我有点迷失了,我可以想象几种解决方案来解决这个问题。 从带有附加数据透视表的多个数据透视表到真正简单的解决方案,其中可能会包括跨表的相当一部分重复。

我对您关于创建一个“大”数据透视表而不是多个小数据透视表的看法特别感兴趣:
- “大”表看起来像这样:“id”“ingredient_id”“product_id”“unit_id”...所以基本上将所有数据透视表数据组合在一个大表上。
- “小”表看起来像“product_unit”、“ingredient_product”。 这个问题让我很困惑。
我认为一张大 table 是最好的,但说实话我没有真正的想法。

我正在使用 Laravel,而且我对编码还很陌生。如果有某种工具或东西可以让您的建议更容易,请告诉我,我会尝试一下!

提前非常感谢!

最佳答案

我第一次用 Laravel 学习这个时遇到了很多麻烦。这个问题的伟大之处在于,您可以使用迁移来尝试一些东西,如果这不是最好的方法,则可以将其回滚。

Eloquent 基于 [事件记录模式][1],因此阅读事件记录指南将会有很大帮助。您的目标是[数据库规范化][2]。由于 RoR 已经存在很长时间并且使用相同的模式,因此我在搜索“数据库规范化轨道”时运气更好。

我发现继续做你最初做的事情会更容易。

超市->有很多->厂家

制造商->属于多个->超市

产品->属于一个->制造商

制造商->有很多->产品

如果产品总是有金额,并且产品没有很多金额,通常最好将其放在产品表上。通常,产品上会有批发_amt、零售_amt。

如果您有单位金额之类的内容:

unit_amount table:
id | title
1    pallet
2    case
3    box
4    single

...而不是将其放在单独的表中。原因是这样您可以轻松地修复拼写错误,仅在一处添加不同的金额。如果您的开发人员在更新 sql 中拼错了板盘,您最终不会在产品表中出现重复的稍微拼写错误的记录。

产品表将有一个unit_amount列,它存储像这样的id:

product table:
id | title | unit_amount
1  | water |   2

对于多对多关系,您只需要一个数据透视表。数据透视表应该允许您执行如下查询:

select * from manufacturer_product where manufacturer_id = 2

...并获取制造商 2 的每件产品。重要的是,如果制造商有很多产品,那么每件产品都是新记录。

manufacturer_product table:
manufacturer_id | product_id
     2          |   1 
     2          |   8
     2          |   12 

如果您在该表上也有一个Warehouse_id,并且制造商有 900 种产品但有 2 个仓库,那么该系统就会崩溃:

manufacturer_id | product_id | warehouse_id
     2          |   1        |  1
     2          |   8        | 
     2          |   12       | 

如果您有一堆其他列,您会 1.) 返回一堆您不需要的数据 2.) 无法再使用 Eloquent 关系 3.) 您要为该表命名什么?

Dayle Rees 这里有一本关于 Eloquent 关系的精彩指南,对我来说非常有帮助:

http://daylerees.com/codebright/eloquent-relationships

I basically want to load 'ingredients' which are related to 'products' which are related to 'manufacturers

为此,您需要使用“有很多通过”关系。它看起来像这样:

class Manufacturer extends eloquent {

    public function products {
        return $this->hasMany('Product');
    }

    public function ingredients {
         return $this->hasManyThrough('Ingredient', 'Product');  //has many ingredients through products
    }

}

您可以这样查询关系:

$manufacturer = new Manufacturer;
$ingredients = $manufacturer->ingredients();

相反的方法也有效:

class Ingredient extends eloquent {

    public function products {
        return $this->belongsToMany('Product');
    }

    public function manufacturer {
         //this is actually belongToThrough but they don't call it that
         return $this->hasManyThrough('Manufacturer', 'Product');
    }

}

http://laravel.com/docs/4.2/eloquent#relationships

逆矩阵变得有点困惑,请参阅此处的讨论:

https://github.com/laravel/framework/issues/6161

[1] http://en.wikipedia.org/wiki/Active_record_pattern [2]http://en.wikipedia.org/wiki/Database_normalization

关于mysql - 数据库设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27257115/

相关文章:

mysql - 如何在 hibernate 状态下将多个日期映射到预订并避免冗余?

mysql - 从 PHP 序列化到 MySQL 的安全风险?

mysql - 将 Mysql 和 My.cnf 优化为 16g Ram 和 8 核 CPU? [30-80并发用户,高峰时200-300]

php - Laravel 5.4 Api 路线 401

javascript - 在 Laravel Blade 模板的 JavaScript 中使用 HTML 存储 PHP 变量

mysql - 确定多个 MySQL 表的正确键值

mysql - 我怎样才能使查询强制使用这样的索引?

mysql - 无法启动mysql集群SQL节点

php - 如何使用 orWhere 创建动态 where 子句 - Laravel 4

mysql - 如何存储数据——我应该直接复制它吗