处理删除和重命名关系记录

时间:2010-08-06 17:58:30

标签: php mysql

我正在开发一个涉及以下实体的关系系统:

  • 询问
  • 引用
  • 供应商
  • 车辆

查询是系统的主要模型,包含所有其他实体的外键。

现在我关心的是,例如,如果客户端去除并删除了一个城镇 - 查询记录有一个城镇ID的引用,因此会破坏系统。同样,如果客户端去除并删除了一辆车,那么供应商记录就会中断。

那么处理关系记录删除的最佳方法是什么?我们是否应该提供删除记录的工具(可能有一个启用/禁用的布尔开关?)。

同样,在重命名记录时,我们如何保留较旧记录的原始数据(例如,如果客户决定将“公共汽车”重命名为“小巴”)。

4 个答案:

答案 0 :(得分:3)

如果您想在数据库级别处理此问题,Foreign Key constraints with Cascading Updates and Deletes就是您要找的。要在您的应用程序中处理此问题,use an ORM,例如Doctrine

答案 1 :(得分:2)

  

处理关系记录删除的最佳方法是什么?

仅允许删除孤立记录?如果我从ENQUIRY删除与特定车辆相关的记录,则有人应该能够删除该车辆。但是在处理子引用之前 ...使用NOT EXISTS非常容易处理:

DELETE FROM VEHICLES
 WHERE NOT EXISTS(SELECT NULL
                    FROM ENQUIRY e
                   WHERE e.vehicle_id = VEHICLES.vehicle_id)

  

同样,在重命名记录时,我们如何保留较旧记录的原始数据(例如,如果客户决定将“公共汽车”重命名为“小巴”)。

这就是为什么将名称/描述与主键分开以用作外键的原因。如果VEHICLES表有两列 - vehicle_id和vehicle_description - 那么描述可以在没有参照完整性影响的情况下改变,因为您在vehicle_id列上定义了外键。

答案 2 :(得分:1)

您在本文中提出了几个问题。首先,允许具有低权限的用户通过切换isLive列来软删除记录可能是有益的,如您用位值指示的那样。其次,您可能会受益于创建一个影子表,该影子表将用于记录用户执行的CRUD操作。通过这一点,您将能够记录世界卫生组织进行的更改,更改类型(创建/更新/删除),更改的位置(表A,第1列)。第三,您需要仔细处理由外键绑定的值的删除。在从源表中删除之前,必须删除所有相关连接。因此,在删除Town中的记录之前,您将删除查询中的记录。希望这会有所帮助..

答案 3 :(得分:1)

这是一个常见问题。用户想要删除“总线”,因为他们不再使用它,并且不想在查询表单上看到它。但是你需要记录,因为它与500个旧的查询相关联。

向记录添加启用/禁用或活动/非活动标志。允许用户在需要时禁用记录。 (还允许他们在意识到错误时重新启用记录。)不要在查询表单上显示已禁用的记录,而是将它们保存在数据库中以便能够正确显示旧数据。

如果您愿意,如果没有与记录关联的查询,您还可以允许删除(从数据库中实际删除)。我个人不会显示删除按钮,除非我确定可以删除记录,因为我发现如果用户可以点击删除按钮但后来被告知他们无法删除,他们会感到沮丧。所以我在给出选项之前检查是否可以删除记录。

用户编辑记录并将值从“总线”更改为“小巴”或“ACME壁纸公司”的问题到'XYZ Catering'是你必须要忍受的。用户教育和轻松添加新记录是处理它的唯一真正方法。必须告诉用户添加和编辑是不同的。有时他们必须在表格,警告信息等方面提供帮助文本。我不知道你可以通过编程方式做的任何事情,可以准确地区分对场地的修正,以及对场地的全面改变。