我认为您对两个不同问题感到困惑,一个是何时使用InnoDB而不是MyISAM,另一个是何时使用外键(FK)约束。
关于第一个问题,已经有许多答案很好地解释了MyISAM和InnoDB之间的区别。我只想重申一下,在tvanfosson从一篇文章中引用的话中,MyISAM更适合大多数读取系统。这是因为它使用表级锁定而不是像InnoDB那样的行级锁定,所以MyISAM不能像InnoDB那样处理高并发,并且缺少帮助数据完整性的功能,例如事务和外键(再次由其他人提到)。
您不必在数据模型中使用FK约束。如果您知道表之间的关系,并且您的应用程序没有错误,那么您可以很好地没有FK。然而,使用FK在数据库层面上为您提供了额外的保险,因为MySQL将根据您创建的约束条件阻止应用程序插入错误数据。
如果你不清楚为什么要使用主键(PK),那么让一个列,例如
id_order
成为
orders
表的主键意味着MySQL不会让你插入相同的
id_order
值超过一次,因为主键列中的每一行必须是唯一的。
外键(FK)将用于具有对另一个表的依赖关系的表上,例如,
order_items
将依赖于
orders
表(如下所示)。
id_order_items
是
order_items
的主键,你可以将
id_order_items
作为
orders
表的外键,以建立
orders
和
order_items
之间的一对多关系。同样地,
id_item
可以是
order_items
表中的外键,也可以是
items
表中的主键,以建立
order_items
和
items
之间的一对多关系。
然后,外键约束的作用是防止你向order_items表中添加一个不在items表中的id_item值,或向orders表中添加一个不在order_items表中的id_order_items值。所有外键只是确保数据完整性,并帮助其他开发人员(以及几个月后忘记系统的自己)传达表之间的关系,但主要是为了数据完整性。
额外加分:那么为什么要使用事务?好吧,你已经提到了一句话,说它们对银行系统有用,但它们在更多情况下也很有用。
基本上,在关系型数据库中,特别是在
标准化的情况下,常规操作(例如添加订单、更新订单或删除订单)通常会涉及多个表和/或多个SQL语句。甚至可能会多次触及同一张表(如下面的示例所示)。顺便说一下,数据操作语言(DML)语句(
INSERT
/
UPDATE
/
DELETE
)一次只涉及一张表。
添加订单的示例:
我建议使用一个
orders
表和一个
order_items
表。这样可以在
orders
表中具有
id_order
的主键,这意味着在
orders
中不能重复使用
id_order
。如果没有1对多的
orders
-
order_items
关系,那么每个与多个商品相关联的订单都需要在
orders
表中有多行 (此电子商务系统还需要一个
items
表)。这个例子将添加一个订单并使用4个不同的
INSERT
语句触及2个表。
(仅作说明,无关键约束)
INSERT INTO orders (id_order, id_order_items, id_customer)
VALUES (100, 150, 1)
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 1)
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 2)
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 3)
那么如果插入 #1 和插入 #2 查询成功,但插入 #3 语句失败了呢?你最终会得到一个缺少项目的订单,那将是垃圾数据。在这种情况下,如果您想回滚所有查询,以便数据库与添加订单之前处于相同状态,然后重新开始,那么这正是事务的用途。您将要一起组合查询,要么全部完成,要么如果出现异常,则全部不完成,进入事务。
因此,像 PK/FK 约束一样,事务有助于确保数据完整性。
type=InnoDB
- Andrew Ensley