我计划有几张桌子,而且我不太确定如何设计"整个事情"。 一些帮助将受到很多赞赏! :)
我基本上想要用食谱和配料模拟超市。 所以我在考虑:
我有点失落,我可以想出几个解决方案来解决这个问题。 从具有附加数据透视表的多个数据透视表到实际的简单解决方案,这些解决方案可能包括表中重复的相当一部分。
我特别感兴趣,您认为创建一个" big"数据透视表而不是多个小表:
- "大"表格看起来像这样:" id" " ingredient_id" " PRODUCT_ID" " UNIT_ID" ...所以基本上将所有枢轴数据组合在一个大桌子上。
- "小"表格看起来像" product_unit"," ingredient_product"。
这个问题让我很困惑。
我认为一张大桌子是最好的,但说实话我并不是真的。
我使用的是Laravel,而且我对编码很陌生。如果有某种工具可以让您的建议更容易,请告诉我,我会试一试!
提前非常感谢!
答案 0 :(得分:1)
首先用Laravel学习这个问题我遇到了很多麻烦。关于这个问题的好处是你可以使用迁移来尝试一些东西,如果不是最好的方法就回滚它。
Eloquent基于[活动记录模式] [1],因此阅读活动记录指南将是一个很大的帮助。您的目标是[数据库规范化] [2]。我更幸运地搜索'数据库规范化轨道',因为RoR已存在很长时间并使用相同的模式。
我发现继续做你最初做的事情比较容易。
supermarket->有很多>制造商
manufacturer->属于many->超市
product->属于one->制造商
manufacturer->具有多个>产品
如果产品总是有金额,而产品没有多少金额,通常最好将产品放在产品表上。通常情况下,产品会有批发_amt,retail_amt在桌面上。
如果你有单位数量的东西:
unit_amount table:
id | title
1 pallet
2 case
3 box
4 single
...比你把它放在一个单独的表中。原因是您可以轻松修复拼写错误,只在一个地方添加不同的金额。如果您的开发人员在更新sql中拼错了托盘,那么您最终不会在产品表中找到重复的错误拼写记录。
product表将有一个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.)不能再使用雄辩的关系了3.)你要用什么名字来表?
Dayle Rees在这里有一个关于雄辩关系的精彩指南,这对我很有帮助:
http://daylerees.com/codebright/eloquent-relationships
我基本上想加载与'制造商
相关的'产品'相关的'成分'
为此你需要使用'has many through'关系。它看起来像这样:
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