存储相关事物的最佳设计

时间:2012-04-29 01:03:43

标签: php mysql symfony doctrine-orm

我正在制作一本在线食谱书,其中有许多食谱,成分,类别等。我必须实现管理员可以将相关食谱添加到给定实体的对象(例如,一个类别有许多相关的食谱,根据我的客户的意愿应该手动添加)。此外,相关配方必须具有订单,该订单也是手动设置的。因此,我需要在食谱和其他每个实体(类别,成分,食谱等)之间建立一个ManyToMany关系,此外我还需要存储每个相关食谱的位置。

一种解决方案可能是为每个具有相关配方的实体设置一个表,每一行都包含实体的ID,配方ID和位置。这意味着我将拥有与相对配方相同数量的实体表,这似乎不是最好的解决方案。

另一种解决方案可能是让1个表包含有关相关配方的所有信息,然后每行还包含另一个实体的类型。另外我对DRY原则非常严格,所以我希望在不编写重复代码的情况下实现这一点,并使用Doctrine2 + Symfony2来处理尽可能多的工作。

如果可能的话,最好的情况是,如果我有一段代码(例如类),我可以重复使用,并将相关的食谱功能添加到新的entites中,而无需编写或复制粘贴很多代码。

什么是最好的类/数据库设计?我正在强调,我正在使用Doctrine2 + Symfony2,所以请尝试“在Doctrine中思考”。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

我会创建以下表格:

category
--------
id
name

category_recipe
---------------
category_id
recipe_id
display_order (integer)

recipe
------
id
name
instructions

recipe_ingredient
-----------------
recipe_id
display_order (integer)
name
amount
unit

recipe_related
--------------
recipe_id
related_recipe_id
display_order

user_recipe
-----------
user_id
recipe_id
display_order

对于类别关系,由于参考表中的额外显示顺序值,您将需要做更多的工作。您需要创建RecipeCategory对象,设置id值,设置显示顺序,然后保存,而不是仅仅将配方添加到类别。 Doctrine仍然可以在这些表之间创建关系,它只需要更多的手动工作。

我希望这有助于您走上正确的道路。