0

我打算有几张桌子,我不太清楚如何去设计“整件事”。 一些帮助将不胜感激! :)DB设计建议

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

  • 超市(名称)
  • 制造商(名称)< - 拥有众多产品
  • 产品(量,单位,姓名)< - 属于制造商
  • 金额(名称)< - 以产品数量为中心的数量
  • 单位(名称)< - 以产品为单位的支点
  • 成分(名称,产品)< - 支点与产品

我有点迷路,我可以想象几种解决方案去做这件事。 从多个数据透视表以及其上的附加数据透视表到真正简单的解决方案,这些解决方案可能包含整个表中相当一部分重复数据。

你如何创建一个“大”数据透视表,而不是多个小的意见特别感兴趣
- “大”表看起来是这样的:“ID”,“ingredient_id”“ product_id“”unit_id“...所以基本上将一个大表上的所有数据透视数据结合起来。
- “小”表反而看起来像“product_unit”,“ingredient_product”。 这个问题让我很困惑。
我认为一张大桌子最好,但我没有诚实的想法。

我正在使用Laravel,我对编码很陌生。如果有某种工具或某件事会让你的建议更容易,请让我知道,我会试一试!

非常感谢!

回答

1

我有很多麻烦先与Laravel一起学习。关于这个问题的好处是,你可以使用迁移来尝试一些事情,如果它不是最好的方法,那么就回滚它。

雄辩是基于[活动记录模式] [1],所以阅读活动记录指南将是一个很大的帮助。你的目标是[数据库规范化] [2]。由于RoR已经存在了很长时间,并且使用了相同的模式,所以我有更好的运气搜索“数据库规范化轨道”。

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

supermarket->有多对一>厂商

与制造商>属于多对一>超市

产品 - >属于单>制造商

与制造商>具有多对一>产品

如果一个产品总是有一定的数量,而一个产品没有多少金额,那么通常只需将其放在产品表上即可。通常情况下,产品将在桌面上有wholesale_amt,retail_amt。

如果您有类似的单位量:

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

...比你会提出,在一个单独的表。原因是,您可以轻松修复拼写错误,只在一处添加不同的金额。如果您的开发人员在更新SQL中拼错了托盘,则不会在产品表中出现重复的有点拼写错误的记录。

产品表将有unit_amount列,存储这样的标识:

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.)不能再使用雄辩的关系,并且3.)你要命名表格是什么?

Dayle里斯有说服力的关系,一个真棒指南这里是真正帮助我:

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

我基本上要加载这些都与“产品”,这是相关的“成分” to'制造商

因此,您需要使用'有很多通'的关系。它应该是这样的:

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

+0

非常感谢!这非常有帮助!我会试着实现它,看看我能得到多少:)如果你偶尔能够拿回战利品,那将会很好。我正在尝试实现它,但我脑海中仍然有一些体面的大问号 – ptrckolous 2014-12-03 08:00:59