如何理解解决 MyISAM FK 问题的方法?

How to understand a way to get around MyISAM FK issue?

大家好。

(我是一名兽医,本学期完成了 web/software 发展方面的 2 年副学士学位,并选择帮助当地的非营利组织来帮助我学习并帮助他们发挥作用。)

我正在为他们制作一个志愿者数据库,但他们仅限于共享主机,不幸的是,MyISAM 是必需的。

老实说,我的脑袋都被这个问题搞得焦头烂额了。在过去的两年里,我一直被教导基本上是 ACID = SQL(好吧,你知道,ACID 的目标应该用于任何数据库实现。)

以下是示例数据库 table 我正在尝试创建和使用:

Table: log
pk: pid
fk: task.pid
fk: volunteer.pid

好吧,我今晚才知道,MyISAM 不允许使用外键。我现在真的有点吓坏了嘿。我什至不知道如何解决这个问题并从这里开始。有什么办法可以让我在日志 table 和任务 table 中引用同一个志愿者?

目标是:

这在 MyISAM 上可行吗?

如有任何帮助,我们将不胜感激。

关系模型的一个关键特征是元组(行)通过共同值彼此相关存储在列中。

从这个意义上讲,MyISAM 支持行之间的关系。

因此,要回答您的问题,是的,您可以在一列中有多个具有相同值的行。

所以,获取志愿者名单...

SELECT v.pid, v.name FROM volunteer v ORDER BY v.name

pid  name
---  ------
43   Barney
24   Fred

为给定的志愿者显示 "all the latest tasks",假设它存储在 log table...

SELECT t.id
     , t.task_name
     , l.log_date
  FROM task t
  JOIN log l 
    ON l.id = t.log_id
 WHERE l.volunteer_id = 24 
 ORDER BY l.log_date DESC

MyISAM 支持声明性约束来强制 table 之间的完整性。

使用 InnoDB,当 [=15] 中不存在匹配行时,您可以确保没有值被放入 log table 的 volunteer_id 列=] table。即volunteertable的id列有匹配值的行。如果您尝试使用具有 FOREIGN KEY 约束的 InnoDB tables 执行此操作,InnoDB (MySQL) 将 return 出错。

MyISAM 缺少的是这种强制 FOREIGN KEY 约束。 MyISAM 将让 INSERT/UPDATE 被执行。 MyISAM 不关心是否有匹配的行。

如果您需要使用 MyISAM 在数据库中强制执行完整性,那将成为应用程序的责任。应用程序需要检查要存储在 log table 中的 volunteer_id 值是否有效...是否引用 volunteer table 中的行, 并决定是继续运行还是停止运行。

但除了这个区别,SQL 是相同的,无论是 InnoDB 还是 MyISAM。