ios - 具有购物 list 功能的食谱应用程序的数据库设计(iOS CoreData)

标签 ios database core-data relational-database database-deadlocks

我正在开发一个食谱应用程序,该应用程序将具有购物 list 功能,我想知道方法是否正确。

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]
- ...

所以基本上购物 list 实体将引用食谱实体的成分。我知道最好将 Ingredient 作为一个单独的实体,但由于用户可能会以不一致的方式输入成分(有/没有数量),我选择将其作为 Recipe 实体的属性。

我相信 Core Data 是某种 ORM,就像 PHP 中的 Doctrine 一样,我见过许多用例,其中每个实体不一定具有 id 属性。在传统的关系数据库中,关系是建立在相互实体的 id 属性上的,但 Core Data 似乎能够在不需要 id 的情况下建立关系。

所以我对购物 list 实体的处理方式是,我将引用 Recipe[3].ingredients[4] 之类的成分,我想知道这是否是一种可以接受的做法,或者甚至是完全错误的思维方式。

由于购物 list 实体将是其他实体的纯粹引用,我什至不知道我是否需要为此拥有一个实体。如果 iPhone 有某种本地存储,我可以直接使用它吗?这是不同的问题,但我只想知道保存购物 list 记录的正确方法。

更新

购物 list 实体还应存储用户将通过自定义字段添加的自定义项目。我想知道下图是否正确建立了这种关系。

enter image description here

最佳答案

像这样将您的配料设置为独立对象:

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 }

像这样设置你的购物 list :

ID_k = {purchase:[ID_1,ID_2,ID_3,ID_4] timestamp:[NSDate date]}

对于自定义成分(由用户输入)动态添加到您的成分数据库并以相同的方式引用,例如

ID_5 = {title:"Custom Ingredient"}

您已经掌握了食谱与其配料之间的关系(以及这些配料可能具有的任何特征,例如营养值(value))以及购物 list 与配料之间的关系。

如果需要绑定(bind)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 }

在购物 list 对象中:

ID_k [{recipe:ID_A, ingredients:[ID_1,ID_2], quantity:[2,300,200], timestamp:[NSDate date]}, {}]

在向用户显示数据时,您可以先检查成分的测量类型,然后将浮点值替换为更易于阅读的字符串。

例如,如果您的数量是“0.5”并且您的测量是“文字”(或类似的东西),您可以显示“一半”,或者 0.25 是“四分之一”等。对于其他测量类型,例如“克”,直接显示数量和计量单位,例如300 克。

关于ios - 具有购物 list 功能的食谱应用程序的数据库设计(iOS CoreData),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36099811/

相关文章:

ios - 如何动态生成CoreData对象

ios - 向左滑动 uitableViewCell 时将 tableView Item 保存为默认值

ios - 应用程序因内存压力而终止

ios - URL 打开 Swift 应用程序 - 打开作品 - 调用的函数不起作用

mysql - Laravel,多对多表中具有属性的产品

mysql - 创建表语法错误

ios - iOS 上的 VideoToolbox 示例?

jquery - 手机上传选择相机

php - 将所有表格的单元格值更改为零

iphone - 刷新CoreData表?