数据库设计建议

时间:2014-12-02 19:13:30

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

我计划有几张桌子,而且我不太确定如何设计"整个事情"。 一些帮助将受到很多赞赏! :)

我基本上想要用食谱和配料模拟超市。 所以我在考虑:

  • 超市(姓名)
  • 制造商(名称)< - 有许多产品
  • 产品(数量,单位,名称)< - 属于制造商
  • 金额(名称)< - 产品数量的支点
  • 单位(名称)< - 与产品单位的枢轴
  • 成分(名称,产品)< - 与产品一起转动

我有点失落,我可以想出几个解决方案来解决这个问题。 从具有附加数据透视表的多个数据透视表到实际的简单解决方案,这些解决方案可能包括表中重复的相当一部分。

特别感兴趣,您认为创建一个" big"数据透视表而不是多个小表:
- "大"表格看起来像这样:" id" " ingredient_id" " PRODUCT_ID" " UNIT_ID" ...所以基本上将所有枢轴数据组合在一个大桌子上。
- "小"表格看起来像" product_unit"," ingredient_product"。 这个问题让我很困惑。
我认为一张大桌子是最好的,但说实话我并不是真的。

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

提前非常感谢!

1 个答案:

答案 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