我认为您对两个不同的问题感到困惑,即何时使用 InnoDB 而不是 MyISAM,以及何时使用外键 (FK) 约束。
至于第一个问题,已经有很多答案很好地解释了 MyISAM 和 InnoDB 之间的区别。我只是重申一下,在 tvanfosson 引用的一篇文章中,MyISAM 更适合以读取为主的系统。这是因为它使用表级锁定而不是像 InnoDB 那样的行级锁定,因此 MyISAM 也无法处理高并发,而且它缺少有助于数据完整性的功能,例如事务和外键(同样,其他人已经提到过)。
您不必在数据模型中使用 FK 约束。如果您知道表之间的关系是什么,并且您的应用程序没有错误,那么没有 FK 就可以了。 但是,使用 FK 可以在数据库层为您提供额外的保障,因为 MySQL 不会让您的应用程序根据您创建的约束插入错误数据。
如果您不清楚为什么要使用主键 (PK),则创建一个列(id_order
例如表的 PK)orders
意味着 MySQL 不会让您多次INSERT
使用相同的值,因为 PK 中的每一行id_order
列必须是唯一的。
FK 将用于依赖于另一个表的表,例如,order_items
将依赖于orders
(下)。 id_order_items
是 的 PK ,order_items
您可以使表id_order_items
的 FK在和orders
之间建立一对多的关系。同样,可以是表中的 FK 和表中的 PK,以在和之间建立一对多的关系。orders
order_items
id_item
order_items
items
order_items
items
**然后,FK 约束的作用是阻止您添加id_item value to the
order_items table that isn't in the
items table, or from adding a
id_order_items to
orders that isn't in the
order_items `表。
FK 所做的只是确保数据完整性,它还有助于将表之间的关系传达给没有编写系统的其他开发人员(以及几个月后你忘记的自己!),但主要是为了数据完整性。**
额外信用:那为什么要使用交易? 好吧,您已经提到过一句话,说它们对银行系统很有用,但它们在更多情况下有用。
基本上,在关系数据库中,特别是在规范化的情况下,添加订单、更新订单或删除订单等常规操作通常会涉及多个表和/或涉及多个 SQL 语句。您甚至可以多次触摸同一张桌子(如下例所示)。顺便说一句,数据操作语言 (DML) 语句 ( INSERT
/ UPDATE
/ DELETE
) 一次只涉及一个表。
添加订单的示例:
我推荐一张orders
桌子和一张order_items
桌子。这使得您可以id_order
在orders
表格中进行 PK,这意味着id_order
不能在orders
. 如果没有一对多的orders
关系,对于每个有多个关联项目的订单,您必须order_items
在表中有多行(顺便说一句,这个电子商务系统也需要一个表)。此示例将添加一个订单并使用 4 个不同的语句来接触 2 个表。orders
items
INSERT
(没有用于说明目的的关键约束)
-- insert #1
INSERT INTO orders (id_order, id_order_items, id_customer)
VALUES (100, 150, 1)
-- insert #2
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 1)
-- insert #3
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 2)
-- insert #4
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 3)
那么如果insert #1和insert #2查询成功运行,但insert #3语句没有运行怎么办?您最终会得到一个缺少商品的订单,这将是垃圾数据。如果在这种情况下,您想要回滚所有查询,以便数据库处于添加订单之前的相同状态,然后重新开始,那么这正是事务的用途。**您将您希望全部完成的查询组合在一起,或者在出现异常的情况下,然后根本没有,将它们组合到一个事务中。
因此,与 PK/FK 约束一样,事务有助于确保数据完整性。**