【问题标题】:MYSQL Database Structure - Storing Multiple ValuesMYSQL 数据库结构 - 存储多个值
【发布时间】:2014-05-18 18:04:48
【问题描述】:

我有一些关于新数据库结构的问题。

1. 假设用户可以创建食谱。每个食谱显然都会有几种成分。每种成分都有以下 4 个字段。

1. ingredients
2. quantity of ingredients
3. unit size of the ingredients
4. prep method for the ingredients

我一直在绞尽脑汁想弄清楚如何构建它。我是否应该简单地创建四行并将每个输入包含到一个数组中并将其存储在它所属的行中?最好的方法和最有效的方法是什么?

2.如果您有一个描述字段和方向字段,其中字符长度是未知的,那么这里最好使用 blob 类型吗?

谢谢!

【问题讨论】:

    标签: mysql types


    【解决方案1】:

    由于您的成分可以出现在许多食谱中,并且不同的食谱可以包含相同的成分,因此您的食谱和成分之间存在 N:N 关系。

    另一方面,你有所谓的关系属性,所以我会尝试类似:

    • 食谱表:食谱
    • 成分表:成分表
    • 配方 - 有 - 成分关系:存储在表中:HAS_INGREDIENT 其中:数量单位尺寸预方法 是字段,其中 RECIPES 主键和 INGREDIENTS 主键是外键。

    考虑以下 ER 图:

    【讨论】:

    • 哇!你是怎么做到的?我的 goolefu 让我失望了!
    • 啊,没关系。出于某种原因,我暂时受到了您能够使用标记生成该图表的影响,我现在看到这只是一个图像。
    • 谢谢!我将使用这种方法。
    【解决方案2】:
    ingredients table
    -----------------
    id
    name
    
    
    users table
    -----------
    id
    name
    
    
    recipes table
    -------------
    id
    user_id
    prep_method
    
    
    recipe_ingredients table
    ------------------------
    recipe_id
    ingredient_id
    quantity
    unit
    

    【讨论】:

    • 谢谢。我曾想过这样做。但是,这仍然没有回答应该如何存储它的问题。每个区域都有一个新行还是一行中每个区域的所有数据?
    • 除了recipe_ingredients只有一条记录。在recipe_ingredients 表中,您可以为配方的每种成分创建一条记录。
    • 我认为于尔根当场击中了它。关于存储文本,我只是将其存储为 varchar - 选择一个您认为足够的值。添加验证以防止将过大的值推送到您的数据库。
    【解决方案3】:

    对于 #2 - 通常您会使用 TEXT 字段。 BLOBS 通常用于存储二进制数据。 MySQL 有几种不同的文本类型——你必须考虑你的理论上限,并选择合适的文本类型。

    【讨论】:

      【解决方案4】:

      实际上,我刚刚开始从事一个与此相关的学习项目,作为我储藏室库存跟踪系统的一部分。

      问题一:

      我们有一个食谱,其中包含许多配料、许多方向以及各种其他属性,例如份量烹饪时间 等。成分是它们自己在数据库中的表(模型),它们引用(在我的应用程序中,我不知道这与你是否相关)我的储藏室中存在的一个项目。以下是我的模型的基本要点:

      class Recipe < ActiveRecord::Base
        
        ####################
        #   Database Rows:
        #     id            -> integer
        #     name          -> string
        #     description   -> string
        #     directions    -> serialized string, array
        #     servings      -> integer
      
        serialize :directions
      
        # Relations
        has_many :ingredients
      
      end
      

      对我来说,将方向作为字符串数组处理是最直接的解决方案。 ActiveModel 会将整个数组作为单个字符串存储在单个列中,并使用serialize 辅助方法将其转换为应用程序内部的数组。我不确定你是否使用 Rails,所以这可能没有帮助。

      class Ingredient < ActiveRecord::Base
      
        ######################
        # Database Rows:
        #   id           -> integer
        #   quantity     -> decimal
        #   measurement  -> string
        #   inventory_id -> integer
      
        # Relations
        belongs_to :recipe
        has_one :inventory
      
      end
      

      更明确地说,在数据库中,有“食谱”和“配料”表。单个配方将引用成分表中的许多行。配方存储它所包含的成分列表。

      问题2:

      根据this,我们正在查看字符串列的 8,000 字节限制。这足以满足您的需求吗?你决定。如果您认为描述太小,您可以更改行类型。您可以将方向存储在单独的表中,以便每个单独的方向具有 8,000 字节的限制。不过,这些都是很长的方向......

      我的项目是here,如果你想四处看看或其他什么。仍在进行中。

      【讨论】:

      • 非常有用!谢谢.. +1'd ya
      猜你喜欢
      • 2018-12-05
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 2016-03-21
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多