2012-07-19 33 views
5

He usado principalmente tablas MyISAM antes, que no admiten claves foráneas. Mirando el desbordamiento de la pila, no encontré una explicación clara y concisa de lo que realmente está haciendo una clave foránea. Lo que más me interesa unir tablas, donde tendría un esquema como éste:¿Cómo funcionan las claves externas?

customers 
id category_id 

products 
id category_id 

categories 
id 

customerproducts 
customer_id product_id 

Si tengo las claves externas en customerproducts, se asegurará de que sólo los clientes válidos y sólo productos válidos entrar en esa mesa, pero ¿Qué pasa si trato de agregar un producto de la categoría de teléfonos a un cliente designado como único interesado en copiadoras? ¿Esto provocará que se violen las restricciones de clave externa?

+0

posibles duplicados: http://stackoverflow.com/questions/4262554/database-design-whats-the-point-of-identifying-foreign-keys, http://stackoverflow.com/ preguntas/18717/are-foreign-keys-really-necessary-in-a-database-design, http://stackoverflow.com/questions/83147/whats-wrong-with-foreign-keys – LittleBobbyTables

+0

Las tres preguntas son esencialmente preguntando por qué? Estoy tratando de preguntar ¿cómo? Awesome handle por cierto. –

Respuesta

1

Lo que más me interesa unir tablas, donde tendría un esquema como éste:

Usted no tiene un esquema de esa manera - que no representa los hechos que usted' re interested in. Vamos a esbozar algunas tablas en SQL. (Probado en PostgreSQL) Primero, clientes y productos.

-- Customer names aren't unique. 
create table customers (
    cust_id integer primary key, 
    cust_name varchar(15) not null 
); 
insert into customers values (1, 'Foo'), (2, 'Bar'); 

-- Product names are unique. 
create table products (
    prod_id integer primary key, 
    prod_name varchar(15) not null unique 
); 
insert into products values 
(150, 'Product 1'), (151, 'Product 2'), (152, 'Product 3'); 

Hay diferentes categorías para los productos.

create table categories (
    cat_name varchar(15) primary key 
); 
insert into categories values ('Cable'), ('Networking'), ('Phones'); 

Cada producto puede aparecer en varias categorías.

create table product_categories (
    prod_id integer not null references products, 
    cat_name varchar(15) not null references categories, 
    primary key (prod_id, cat_name) 
); 

insert into product_categories values 
(150, 'Cable'), (150, 'Networking'), (151, 'Networking'), (152, 'Phones'); 

Un cliente puede estar interesado en varias categorías de productos.

create table customer_category_interests (
    cust_id integer not null references customers, 
    cat_name varchar(15) not null references categories, 
    primary key (cust_id, cat_name) 
); 

-- Nobody's interested in phones 
insert into customer_category_interests values 
(1, 'Cable'), (1, 'Networking'), (2, 'Networking'); 

Si tengo las claves externas en customerproducts, se asegurará de que sólo clientes válidos y sólo productos válidos entrar en esa mesa, pero lo sobre si trato de añadir un producto de la categoría de teléfonos para un cliente asignado como único interesado en copiadoras?

Los clientes no están interesados ​​en cada producto en sus categorías preferidas. Tenga en cuenta la superposición de restricciones de clave externa.

create table product_interests (
    cust_id integer not null, 
    prod_id integer not null, 
    cat_name varchar(15) not null, 
    foreign key (cust_id, cat_name) references customer_category_interests, 
    foreign key (prod_id, cat_name) references product_categories, 
    primary key (cust_id, prod_id, cat_name) 
); 

insert into product_interests values 
(1, 150, 'Cable'), (2, 150, 'Networking'); 

Esta próxima inserción fallará, porque al cliente 1 no le interesan los teléfonos.

insert into product_interests values 
(1, 152, 'Phones'); 
 
ERROR: insert or update on table "product_interests" violates foreign key constraint "product_interests_cust_id_fkey" 
DETAIL: Key (cust_id, cat_name)=(1, Phones) is not present in table "customer_category_interests". 
Cuestiones relacionadas