我在后端有一个关系数据库(MySQL),在前端有一个很酷的BackboneJS。我有几个通过外键互连的表(BackboneJS行话中的模型)。

问题

如何销毁特定模型,以使销毁级联到所有子模型?



考虑以下快速模式:

PERSON
id
name

PHONE_NUMBER
id
person_id
number

EMAIL_ADDRESS
id
person_id
email


考虑我们在数据库中存储了一个“杰克”人,其中包含一些电话号码和电子邮件地址。另外,我们为所有3个表定义了BackboneJS模型/集合,并将数据加载到其中。前端的用户决定通过单击删除Jack的记录。

现在,有一些删除杰克所有记录的方法:

方法#1

在与Jack相关的所有电话号码和电子邮件地址模型上调用“ destroy”,然后在Jack本身上调用“ destroy”。

问题)


太多的AJAX要求执行一项操作。
用户将不得不等待很多时间。 (更多的家属,更多的时间)
删除将是非事务性的。如果用户在此期间关闭浏览器,则数据将被破坏。


方法#2

在数据库级别定义外键关系,以确保在删除PERSON行时,级联删除PHONE_NUMBER和EMAIL_ADDRESSes。然后在前端对Jack进行“销毁” BackboneJS模型。


用于依赖项的BackboneJS模型永远不会知道后端中其对应记录发生了什么。因此它们将保持原样。


方法#3

在服务器端应用程序“ / thoroughly-delete-person”上创建一个URL(以确保删除一个具有其所有依赖关系的人),然后从前端调用它,而不是在Jack上调用BackboneJS的Model#destroy。


与方法2相同的问题


因此,似乎没有完美的解决方案来解决这个简单的问题。你也面对吗?您采取了什么方法,为什么更好?

最佳答案

我有一个类似的问题,我采用了方法2,但有一个区别。

如果可以,请将Jack表示为包含phone_numberemail_address的单个主干模型。您可以将Jack模型传递到其他Backbone视图以共享Jack的模型数据。然后可以在destroy模型上调用Jack

在后端,我使用了on delete cascade,因此我可以进行查询:

delete from PERSON where id = JACK_ID;

我不知道mysql的语法,但类似:

 PERSON
  id
  name

 PHONE_NUMBER
  id  references PERSON (id) on delete cascade
  person_id
  number

 EMAIL_ADDRESS
  id  references PERSON (id) on delete cascade
  person_id
  email


我不确定这将如何适合您当前的问题背景,但这与我所做的类似,并且对我有用。

07-25 22:27
查看更多