1

假设您正在编写一个简单的应用程序。该模型是一个“项目”有一个“类别”。可以通过从包含所有可能类别的下拉列表中进行选择来编辑项目的类别。

用户创建以下类别:C1、C2、C3。

用户创建以下项目、类别关联:[P1, C1], [P2, C2], [P3, C3]

后来,C2 类被删除。现在,如果用户尝试编辑 Project P2 的类别,则会出现一些问题:需要检索类别以填充下拉列表。但已删除的类别将不会被检索。因此不会检索到 C2。(如果检索到已删除的类别,则下拉列表将充满已删除、不可用的字段)

湾。如果 C2 也被检索,则存在用户可以再次将已删除的类别 C2 分配给 P2 的风险。

处理这个问题的最佳设计方法是什么?

4

7 回答 7

2

不允许他们删除 C2。或者,或者,允许他们根据需要删除 C2,但将系统中的所有 C2 类别更改为未定义的类别。这样,他们下次编辑项目时必须选择一个类别(它仍然有效,因为它指向先前创建的“未定义”类别)。

于 2009-09-16T19:58:43.913 回答
2

您遇到了参照完整性问题。

只要现有项目仍引用某个类别,您就无法删除该类别。但是,您可能会考虑添加一个标志 IsDeleted,现在允许将新项目分配给该类别。

于 2009-09-16T19:59:09.917 回答
2

我使用了一个“过时”字段,它不会从存在中删除该类别,只是从相应的屏幕/下拉菜单中隐藏,但允许出于历史原因在报告中使用数据。

于 2009-09-16T20:00:08.140 回答
1

一般来说,对于像这样的结构元素,除非您严重缺乏数据存储,否则请保持元素完整并带有已删除标志,以便在删除之前引用它的内容不会损坏。或者,引入一个涟漪删除,它也会删除引用它的所有内容。

于 2009-09-16T20:00:33.003 回答
1

为了保持一致性,您不能删除C2,但您可以添加禁用它的选项,而不是实际删除。这样新项目就不会分配给C2.

于 2009-09-16T20:01:09.353 回答
0

对于参考表,您需要将所有旧数据重新分配给一个新的有效类别,或者在该类别中保留一些其他字段来表示它何时有效,例如它有效的日期或日期范围。

布尔“已删除”标志意味着您将无法(可能无法)在不更新类别的情况下编辑旧数据,但这可以推迟到旧数据被编辑为止。

于 2009-09-16T20:10:09.823 回答
0

我已经用其他人提到的软删除处理了这个问题。然后在填充我的下拉列表时,我在修改分配给 C2 的项目时将 C2 添加到下拉列表的顶部(仅适用于已删除的类别)。这样,东西可以在 C2 中,并且可以从 C2 中移出,但不能在 C2 中放置任何新内容(因为如果它不在 C2 中,则它不在下拉列表中。)

I recall that the code to do this was not particularly pretty, but not very difficult either. I don't have the project open right now, but I can add more details later if you are interested.

于 2009-09-16T21:33:42.547 回答