我正计划有几张桌子,但我不确定如何设计“整体”。
一些帮助将不胜感激! :)

我基本上想用食谱和食材模拟一家超级市场。
所以我在想:


超市(名称)
制造商(名称)产品(数量,单位,名称)金额(名称)单位(名称)成分(名称,产品)

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

我对您关于创建一个“大”数据透视表而不是多个小数据透视表特别感兴趣:

-“大”表看起来像这样:“ 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

07-25 23:06
查看更多