我正计划有几张桌子,但我不确定如何设计“整体”。
一些帮助将不胜感激! :)
我基本上想用食谱和食材模拟一家超级市场。
所以我在想:
超市(名称)
制造商(名称)产品(数量,单位,名称)金额(名称)单位(名称)成分(名称,产品)
我有点迷茫,我可以想象几个解决方案来解决这个问题。
从具有附加数据透视表的多个数据透视表到真正的简单解决方案,这些解决方案可能包括跨表重复的相当一部分。
我对您关于创建一个“大”数据透视表而不是多个小数据透视表特别感兴趣:
-“大”表看起来像这样:“ id”,“ ingredient_id”,“ product_id”,“ unit_id”……因此基本上将所有数据透视表数据合并到一个大表上。
-相反,“小”表看起来像“ product_unit”,“ ingredient_product”。
这个问题使我很困惑。
我认为最好有一张大桌子,但是老实说我没有真正的主意。
我正在使用Laravel,并且对编码非常陌生。如果有某种工具或可以使您的建议更容易的工具,请告诉我,我将尝试一下!
非常感谢!
最佳答案
首先和Laravel一起学习时,我遇到了很多麻烦。关于此问题的妙处在于,您可以使用迁移尝试一下,如果不是最佳方法,则可以回滚。
口才是基于[活动记录模式] [1]的,因此阅读活动记录指南将大有帮助。您的目标是[数据库规范化] [2]。由于RoR已经存在了很长时间并且使用了相同的模式,因此我最好能搜索“数据库规范化轨道”。
我发现继续做最初的工作会更容易。
超级市场->有很多->制造商
生产商->属于许多->超市
产品->属于一个->制造商
制造商->有很多->产品
如果产品总是有数量,而产品没有很多,通常最好将其放在产品表上。通常情况下,一个产品的桌子上会带有Wholesale_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
我基本上想加载与“制造商”相关的“产品”相关的“成分”
为此,您需要使用“有很多通过”关系。它看起来像这样:
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