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".
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
Las tres preguntas son esencialmente preguntando por qué? Estoy tratando de preguntar ¿cómo? Awesome handle por cierto. –