具有购物清单功能的配方应用程序的数据库设计(iOS CoreData)

时间:2016-03-19 08:58:54

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

我正在开发一个具有购物清单功能的食谱应用程序,我想知道方法是否错误。

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有某种本地存储空间,我可以使用它吗?这是一个不同的问题,但我只是想知道保持购物清单记录的正确方法。

更新

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

enter image description here

1 个答案:

答案 0 :(得分:1)

将您的成分设置为这样的独立对象:

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"}

您已经捕捉到食谱与其成分之间的关​​系(以及这些成分可能具有的任何特征,例如营养价值)以及购物清单和成分之间的关​​系。

如果您需要将购物清单和食谱之间的关系联系起来,或者如果您只想在食谱中购买某些食材,您可以这样做:

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”并且您的测量值是“文字”(或类似的东西),则可以显示“一半”,或0.25是“四分之一”等。对于其他测量类型,例如“gram”,只是直接显示数量和测量值,例如300克。