¿Debo usar keys extranjeras?

Posible duplicado:
¿Qué pasa con las llaves extranjeras?

Yo uso MS Sql Server con una gran database de 4 GB de datos.

Busco en la web por qué debería usar keys externas. por ahora solo indexé las keys usadas para unir tables. El performance está bien, la integridad de los datos no es un problema.

¿Debo usar keys extranjeras? ¿Obtendré aún más performance con keys externas?

Las keys externas en realidad no mejoran el performance, de hecho incurren en una pequeña penalización de performance en todas las operaciones de escritura, para garantizar que se cumple la restricción.

La razón por la que desea utilizar estos es para evitar operaciones de escritura destructivas. Si no los tiene, un código erróneo o una sentencia sql incorrecta pueden eliminar las filas que se espera que estén allí.

La integridad puede no ser un problema hoy, pero esa es la actitud exacta que lo convierte en un problema mañana o dentro de dos semanas.

Una key externa es principalmente una herramienta para hacer cumplir la integridad de la database, que no está relacionada con la velocidad de ejecución.

Si ya ha optimizado su layout de índice, probablemente ya tenga estos índices instalados, al less como índices no únicos. Así que no esperaría ningún cambio en el performance solo por la installation de keys externas (que ni siquiera implican necesariamente un índice).

Sin embargo, sospecho un poco de tu complacencia con respecto a la optimization de tu layout si aún no tienes este concepto encriptado.

Lea la documentation de Foreign Keys con el objective de comprender lo que hacen para forzar la integridad (vale la pena conocerla en cualquier caso). Luego, vea si eso no responde su pregunta de forma más completa.

Lo que no se mencionó en la pregunta anterior a la que SquareCog se vinculó anteriormente – sí, las restricciones de key externa pueden ser dolorosas al realizar limpieza de datos, actualizaciones de lotes, generación de datos de testing o cualquier tipo de operación en la que omita la secuencia normal de cosas. Pero, siempre puede eliminar sus restricciones de key externa antes de hacer algo como esto, y luego volver a crearlas más tarde (si tiene los objects de la database orderados correctamente, esto no es un trabajo extra).

Solía ​​ser flojo, pero he llegado a depender de las restricciones de key externa. Todavía hay situaciones en las que no puede tenerlas, como en las relaciones entre bases de datos.

En MySQL puede desactivar las foreign keys con SET FOREIGN_KEY_CHECKS=0

Hay una característica / restricción que Foreign Keys aporta a su sistema, que no se ha mencionado hasta ahora. Esa es la lógica de compromiso / transacción (así es como lo llamo de todos modos). Con Foreign Keys habilitada, todas las filas para una actualización, en todas las tablas afectadas, necesitan estar allí para que la confirmación funcione (no arrojar un error de SQL que indique que se han violado las Restricciones de key externa).

Si tiene un cuerpo de código, que funciona y "juega rápido y suelto", con commits / transactions. Entonces podría estar en una solución, para hacer que las cosas funcionen con FK en el esquema.

Además, Oracle al less, le permite desactivar restricciones (no solo colocar / eliminar). Entonces puedes encenderlos / apagarlos fácilmente. Es útil, cuando quiere hacer algunas operaciones masivas ya sea sin la sobrecarga de las restricciones, o para hacer alguna "cirugía" en los datos que tiene estados intermedios que fallarían las restricciones.

Las keys externas mejoran la integridad de los datos, el performance, algo más lento al eliminar / insert / actualizar.
En mi última compañía, decidimos mantener la integridad / conexiones en el BL, ya que simplifica los cambios en el BL (piense en cientos de millones de loggings). Si tienes una aplicación pequeña, no veo ninguna razón para no hacerlo en la capa de datos (db)

Las keys externas también ayudan a mantener su database limpia, ya que puede hacer que la database haga una caída en cascada.