Creo que está confundido acerca de dos cuestiones diferentes, cuándo utilizar InnoDB en lugar de MyISAM, y cuándo usar extranjera restricciones clave (FK).
En cuanto al primer problema, ha habido muchas respuestas que explican las diferencias entre MyISAM e InnoDB. Solo voy a reiterar que, en la cita de tvanfosson de un artículo, MyISAM es más adecuado para sistemas con lecturas en su mayoría. Esto se debe a que utiliza bloqueo de nivel de tabla en lugar de nivel de fila como InnoDB, por lo que MyISAM no puede manejar la alta concurrencia además de características faltantes que ayudan con la integridad de datos como transacciones y claves externas (nuevamente, ya mencionado por otros).
No tiene que usar restricciones FK en su modelo de datos. Si sabes cuáles son las relaciones entre tus mesas y tu aplicación está libre de errores, podrás arreglárrtelas sin FKs. Sin embargo, usar FK brinda un seguro adicional en la capa de la base de datos porque entonces MySQL no permitirá que su aplicación inserte datos incorrectos en función de las restricciones que usted haya creado.
En caso de que no está claro en qué utilizar claves primarias (PK), haciendo una columna tal como id_order
por ejemplo, la FC de la tabla orders
significa que MySQL no se le permitirá INSERT
el mismo valor de id_order
más de una vez porque cada fila en una columna PK debe ser única.
Un FK se usaría en una tabla que tiene una dependencia en otra tabla, por ejemplo, order_items
tendría una dependencia en orders
(abajo). id_order_items
es el PK de order_items
y puede hacer id_order_items
el FK de la tabla orders
para establecer una relación uno a muchos entre orders
y order_items
. Del mismo modo, id_item
podría ser un FK en la tabla order_items
y un PK en la tabla items
para establecer una relación de uno a varios entre order_items
y items
.
** Entonces, lo que la restricción FK hace es a evitar que la adición de un id_item value to the
order_items table that isn't in the
artículos table, or from adding a
id_order_items to
órdenes that isn't in the
order_items `mesa. Todo lo que FK hace es asegurar la integridad de los datos, y también ayuda a transmitir las relaciones entre los desarrolladores **
Crédito adicional: entonces ¿por qué usar transacciones? Bueno, ya mencionó una cita que dice que son útiles para el sistema bancario, pero que son útiles en más situaciones que eso.
Básicamente, en una base de datos relacional, especialmente si es normalized, una operación de rutina como agregar un pedido, actualizar un pedido o eliminar un pedido a menudo toca más de 1 tabla y/o implica más de una declaración SQL. Incluso podría terminar tocando la misma mesa varias veces (como lo hace el ejemplo siguiente). Por cierto, las declaraciones de lenguaje de manipulación de datos (DML) (INSERT
/UPDATE
/DELETE
) solo implican una tabla a la vez.
Un ejemplo de la adición de una orden:
recomiendo una mesa orders
y una mesa de order_items
. Esto lo hace para que pueda tener un PK en el id_order
en la tabla orders
, lo que significa que id_order
no se puede repetir en orders
. Sin la relación 1 a muchos orders
- order_items
, tendría que tener varias filas en la tabla orders
para cada orden que tuviera varios elementos asociados (también necesita una tabla items
para este sistema de comercio electrónico). Este ejemplo agregará un orden y tocará 2 tablas al hacerlo con 4 declaraciones diferentes INSERT
.
(no hay restricciones de claves con fines ilustrativos)
-- 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)
Entonces, ¿qué si el inserto # 1 y inserto # 2 consultas se ejecutan correctamente, pero el inserto # 3 declaración no lo hicieron ? Usted terminaría con un pedido que le faltaba un artículo, y eso sería basura. Si en ese caso, desea deshacer todas las consultas para que la base de datos se encuentre en el mismo estado que estaba antes de , agregue el pedido y vuelva a empezar, bueno, eso es exactamente para lo que son las transacciones. ** Agrupa las consultas que desea que todas hagan, o en el caso de una excepción, ninguna en una transacción.
Así como las restricciones PK/FK, transacciones ayudar a asegurar la integridad de datos **
Su ejemplo está haciendo llaves foráneas, no innodb. Deberías haber preguntado para qué son las claves foráneas. –
¿Qué "hacer daño"? Ese artículo trata sobre cómo recuperarse de una BASE DE DATOS DROP inadvertida. –
Jim Ferrans: Me referí a la frase: "si no eres un programador con mucha experiencia, te dolerá". –