具有购物清单功能的食谱应用程序的数据库设计(iOS CoreData)
Database design for recipe app with shopping list feature (iOS CoreData)
我正在开发一个具有购物清单功能的食谱应用程序,我想知道方法是否正确。
Recipe (one to many)
- title
- serving
- image meta
- ingredients
- steps
- note
Recipe Category (has many Recipe)
- main
- side
- ...
Shopping List (has many recipe ingredients)
- recipe[3].ingredients[2]
- recipe[5].ingredients[3]
- recipe[5].ingredients[4]
- ...
所以基本上购物清单实体将参考食谱实体中的成分。我知道最好将 Ingredient 作为一个单独的实体,但由于用户可能会以不一致的方式输入配料,有/没有数量,我选择将其作为 Recipe 实体的属性。
我相信 Core Data 是某种 ORM,就像 PHP 中的 Doctrine 一样,我见过许多用例,其中每个实体不一定具有 id 属性。在传统的关系数据库中,关系是建立在相互实体的 id 属性上的,但 Core Data 似乎能够在不需要 id 的情况下建立关系。
所以我对购物清单实体的处理方式是,我将参考食谱[3].ingredients[4] 之类的成分,我想知道这是否是一种可以接受的做法,或者甚至是完全错误的思维方式。
由于购物清单实体将是其他实体的纯粹引用,我什至不知道是否需要为此创建一个实体。如果 iPhone 有某种本地存储,我可以直接使用它吗?这是不同的问题,但我只想知道保存购物清单记录的正确方法。
更新
购物清单实体还应存储用户将通过自定义字段添加的自定义项目。我想知道下图是否正确建立了这种关系。
像这样将您的配料设置为独立对象:
ID_1 = {title:"Tomato", x:y, p:k etc}
ID_2 = {title:"Bread"}
ID_3 = {title:"Cheese"}
ID_4 = {title:"Sugar"}
像这样设置你的食谱对象:
ID_A = {ingredients:[ID_1, ID_2, ID_3], title:"Margherita", serving:2 }
ID_B = {ingredients:[ID_2, ID_3], title:"Cheese on Toast", serving:1 }
ID_C = {ingredients:[ID_4], title:"Caramel", serving:6 }
像这样设置您的购物清单:
ID_k = {purchase:[ID_1,ID_2,ID_3,ID_4] timestamp:[NSDate date]}
对于自定义成分(由用户输入)动态添加到您的成分数据库并以相同的方式引用,例如
ID_5 = {title:"Custom Ingredient"}
您已经掌握了食谱与其配料之间的关系(以及这些配料可能具有的任何特征,例如营养价值)以及购物清单与配料之间的关系。
如果需要绑定shopping list和recipe的关系,或者只想购买recipe中的部分食材,可以这样:
ID_k = [{recipe:ID_A, ingredients:[ID_1,ID_2] timestamp:[NSDate date]},{}]
更新
当用户开始输入成分时,例如"To",对您的成分数据库进行字符串搜索并提出建议,例如 "Tomato"。如果找不到现有条目,则允许用户添加自己的条目。这将减少冗余条目的数量。
对于数量,向成分对象添加一个额外的变量,例如
ID_1 = {title:"Tomato Puree", measurement:"liter"}
ID_2 = {title:"Bread", measurement:"gram"}
ID_3 = {title:"Cheese", measurement:"gram"}
在食谱部分:
ID_A = {ingredients:[ID_1, ID_2, ID_3], quantity:[0.5, 200, 300], title:"Margherita", serving:2 }
并且在购物清单对象中:
ID_k [{recipe:ID_A, ingredients:[ID_1,ID_2], quantity:[2,300,200], timestamp:[NSDate date]}, {}]
向用户显示数据时,您可以先检查成分的测量类型,并将浮点值替换为更易于阅读的字符串。
例如,如果您的数量是“0.5”并且您的尺寸是"literal"(或类似的东西),您可以显示"half",或者0.25 是"quarter"等 对于其他测量类型,例如"gram",直接显示数量和尺寸,例如300克。
我正在开发一个具有购物清单功能的食谱应用程序,我想知道方法是否正确。
Recipe (one to many)
- title
- serving
- image meta
- ingredients
- steps
- note
Recipe Category (has many Recipe)
- main
- side
- ...
Shopping List (has many recipe ingredients)
- recipe[3].ingredients[2]
- recipe[5].ingredients[3]
- recipe[5].ingredients[4]
- ...
所以基本上购物清单实体将参考食谱实体中的成分。我知道最好将 Ingredient 作为一个单独的实体,但由于用户可能会以不一致的方式输入配料,有/没有数量,我选择将其作为 Recipe 实体的属性。
我相信 Core Data 是某种 ORM,就像 PHP 中的 Doctrine 一样,我见过许多用例,其中每个实体不一定具有 id 属性。在传统的关系数据库中,关系是建立在相互实体的 id 属性上的,但 Core Data 似乎能够在不需要 id 的情况下建立关系。
所以我对购物清单实体的处理方式是,我将参考食谱[3].ingredients[4] 之类的成分,我想知道这是否是一种可以接受的做法,或者甚至是完全错误的思维方式。
由于购物清单实体将是其他实体的纯粹引用,我什至不知道是否需要为此创建一个实体。如果 iPhone 有某种本地存储,我可以直接使用它吗?这是不同的问题,但我只想知道保存购物清单记录的正确方法。
更新
购物清单实体还应存储用户将通过自定义字段添加的自定义项目。我想知道下图是否正确建立了这种关系。
像这样将您的配料设置为独立对象:
ID_1 = {title:"Tomato", x:y, p:k etc}
ID_2 = {title:"Bread"}
ID_3 = {title:"Cheese"}
ID_4 = {title:"Sugar"}
像这样设置你的食谱对象:
ID_A = {ingredients:[ID_1, ID_2, ID_3], title:"Margherita", serving:2 }
ID_B = {ingredients:[ID_2, ID_3], title:"Cheese on Toast", serving:1 }
ID_C = {ingredients:[ID_4], title:"Caramel", serving:6 }
像这样设置您的购物清单:
ID_k = {purchase:[ID_1,ID_2,ID_3,ID_4] timestamp:[NSDate date]}
对于自定义成分(由用户输入)动态添加到您的成分数据库并以相同的方式引用,例如
ID_5 = {title:"Custom Ingredient"}
您已经掌握了食谱与其配料之间的关系(以及这些配料可能具有的任何特征,例如营养价值)以及购物清单与配料之间的关系。
如果需要绑定shopping list和recipe的关系,或者只想购买recipe中的部分食材,可以这样:
ID_k = [{recipe:ID_A, ingredients:[ID_1,ID_2] timestamp:[NSDate date]},{}]
更新
当用户开始输入成分时,例如"To",对您的成分数据库进行字符串搜索并提出建议,例如 "Tomato"。如果找不到现有条目,则允许用户添加自己的条目。这将减少冗余条目的数量。
对于数量,向成分对象添加一个额外的变量,例如
ID_1 = {title:"Tomato Puree", measurement:"liter"}
ID_2 = {title:"Bread", measurement:"gram"}
ID_3 = {title:"Cheese", measurement:"gram"}
在食谱部分:
ID_A = {ingredients:[ID_1, ID_2, ID_3], quantity:[0.5, 200, 300], title:"Margherita", serving:2 }
并且在购物清单对象中:
ID_k [{recipe:ID_A, ingredients:[ID_1,ID_2], quantity:[2,300,200], timestamp:[NSDate date]}, {}]
向用户显示数据时,您可以先检查成分的测量类型,并将浮点值替换为更易于阅读的字符串。
例如,如果您的数量是“0.5”并且您的尺寸是"literal"(或类似的东西),您可以显示"half",或者0.25 是"quarter"等 对于其他测量类型,例如"gram",直接显示数量和尺寸,例如300克。