首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DB设计建议

DB设计建议
EN

Stack Overflow用户
提问于 2014-12-02 19:13:29
回答 1查看 167关注 0票数 0

我正计划有几张桌子,但我不太确定该如何设计“整件事”。我们会非常感谢你的帮助!)

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

  • 超市(名称)
  • 制造商(名称) <-有许多产品
  • 产品(数量、单位、名称) <-属于制造商
  • 金额(名称) <-支点与产品数量
  • 单位(名称) <-支点与产品单元
  • 成分(名称、产品) <-以产品为主

我有点迷失了,我可以想象出几种解决方案来解决这个问题。从多个枢轴表和附加的枢轴表到真正的简单解决方案,这可能包括大量的跨表重复。

特别感兴趣的是关于创建一个“大”枢轴表而不是多个小表的

  • “大”表看起来像这样:"id“"ingredient_id”"product_id“"unit_id”所以基本上把所有的枢轴数据组合在一个大表上。
  • 相反,“小”表看起来像"product_unit“、"ingredient_product”。这个问题让我很困惑,我想一张大桌子是最好的,但老实说,我没有真正的想法。

我用的是Laravel,我对编码很陌生。如果有某种工具或东西可以使你的建议更容易,请让我知道,我会尝试一下!

提前谢谢你!

EN

回答 1

Stack Overflow用户

发布于 2014-12-03 00:15:30

我和Laravel第一次学这个遇到了很多麻烦。这个问题最重要的一点是,您可以使用迁移来尝试一些东西,如果不是最好的方法,可以将其回滚。

雄辩是基于活动记录模式,因此阅读活动记录指南将有很大的帮助。您的目标是数据库规范化。我在搜索“数据库规范化rails”时运气更好,因为RoR已经存在了很长时间,并且使用了相同的模式。

我发现继续做你刚开始做的事情更容易。

超市->有许多制造商。

制造商->属于许多->超市

产品->属于一->制造商。

制造商->有许多->产品。

如果一个产品总是有一个数量,而一个产品没有多少数量,那么通常最好把它放在产品表上。通常,一个产品会有wholesale_amt,retail_amt在桌面上。

如果您有类似于单位金额的内容:

代码语言:javascript
复制
unit_amount table:
id | title
1    pallet
2    case
3    box
4    single

...than,您可以把它放在一个单独的表中。原因是这样,您可以很容易地修复拼写错误,只在一个地方添加一个不同的金额。如果您的开发人员在update sql中拼错了托盘,那么最终在产品表中不会出现重复的、拼写错误的记录。

产品表将有一个unit_amount列,该列存储id如下:

代码语言:javascript
复制
product table:
id | title | unit_amount
1  | water |   2

对于许多到多个关系,您只需要一个枢轴表。枢轴表应该允许您执行这样的查询:

代码语言:javascript
复制
select * from manufacturer_product where manufacturer_id = 2

...and为制造商2获取每一种产品。重要的是,如果制造商有许多产品,它们都是新的记录。

代码语言:javascript
复制
manufacturer_product table:
manufacturer_id | product_id
     2          |   1 
     2          |   8
     2          |   12 

如果你的桌子上也有一个warehouse_id,而制造商有900个产品,但有2个仓库,那么这个系统就会崩溃:

代码语言:javascript
复制
manufacturer_id | product_id | warehouse_id
     2          |   1        |  1
     2          |   8        | 
     2          |   12       | 

如果你有一堆其他的列,你就是1)。返回一堆不需要2的数据。)不能再使用雄辩的人际关系了。你打算给这张桌子起什么名字?

戴·里斯在这里有一本很棒的关于雄辩的人际关系的指南,对我来说真的很有帮助:

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

我基本上想要装载与“产品”相关的“成分”,而“产品”与“制造商”有关。

为此,你需要使用“有很多通过”的关系。看起来是这样的:

代码语言:javascript
复制
class Manufacturer extends eloquent {

    public function products {
        return $this->hasMany('Product');
    }

    public function ingredients {
         return $this->hasManyThrough('Ingredient', 'Product');  //has many ingredients through products
    }

}

您可以这样查询这种关系:

代码语言:javascript
复制
$manufacturer = new Manufacturer;
$ingredients = $manufacturer->ingredients();

相反的情况也是如此:

代码语言:javascript
复制
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 2

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27257115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档