Ayuda con relaciones

Hola mi nombre es emilia y estoy recién comenzando en este mucho de la informática y me interesa mucho la combinación php y mysql...
Tengo varias tablas, pero siempre he tenido dudas en como relacionarlas y todo el tema de las tablas foráneas. He buscado información pero es muy complicada de entender o no saben explicarse a quienes he consultado y tengo muy claro que esto es esencial para un buen diseño.
A continuación nombro algunas de las tablas con algunos de sus campos y lo que necesito de cada una de ellas con respecto a las relaciones.
Tengo algo de experiencia en access, pero según he leído igual no es muy bueno para gestionar datos con php por el tema de rendimiento... Aquí yo hacia relaciones básicas 2 tablas máximo y había un cuadro relaciones donde trabajarlas, pero en phpmyadmin no.
Las tablas son las siguientes:
Tabla Clientes
Idcli (autonum)
Rut (var)
Dv (var)
Nombre (var)
Apellidos (var)
Tabla NotaVta
Idnotavta (autonum)
Numnotavta (int)
Fechavta (date)
Montocredito (int)
Cantcuotas (int)
Intcredito (int)
En esta tabla se almacenara el proceso de venta del vahiculo. Debe contener tanto información de quien compra como de quien vende (no agregue esos campos porque no se si deben agregarse los rut, nombres y apellidos de cliente y vendedor, así como también información del vehículo que se esta vendiendo). Los campos montocredito, cantcuotas e intcredito debería utilizarse en la tabla convenios para generar el convenio del cliente.
Tabla Convenios
Idconvenio (autonum)
Numcuota (int)
Capital (int)
Interés (int)
Fpago (date)
Estatuota (var)
Aquí debería almacenarse las cuotas del crédito por cliente, por lo que debería haber un campo que indique a que cliente corresponden las cuotas. El calculo del convenio debería tomar los datos necesarios de la tabla notavta.
Tabla Vehículos
Idvehiculo (autonum)
Marca (var)
Modelo (var)
Valor (int)
Tabla Vendedor
Id vendedor (autonum)
Rut (int)
Nombre (var)
Apellido (var)
Comisión (double)
Espero me entiendas y puedas ayudarme... Gracias...

6 Respuestas

Respuesta
1
Como recién comenzada en el mundo de la informática, comprendo perfectamente que sea complicado de entender o bien no hayas entendido a la primera las explicaciones de aquellos a quienes has consultado, puesto que programar lo que tu planteas no es precisamente algo iniciatico, sino una aplicación en toda regla.
Antes de responderte te preguntaré si ¿sabes ejecutar consultas en PHP contra una base de datos MySQL?
Espero tu respuesta. Posteriormente, continuaremos.
Gracias por responder tan rapido....Respecto a tu consulta, si he realizado consultas select....insert...update y delete....pero de una tabla a la vez no en tablas relacionadas....
Espero tu ayuda y comentarios...
Bien, entonces intentaré explicártelo de forma clara y concisa:
Lo primero es tener claras las entidades que entran en juego en tu aplicación. Debes definir una tabla para cada una. Clientes, Proveedores, Agentes, Vendedores, Artículos, etc...
Cada tabla deberá tener su id. Eso creo que lo tienes más o menos. Bien. Una vez definidas, el segundo paso es definir las operaciones que pueden hacerse entre ellas.
En tu caso, creo que es Tabla NotaVta.
¿En ella debe indicarse el cliente, vendedor y vehículo?
Correcto:
Si, lo lógico sería tener una tabla de clientes, una de vehículos y otras de vendedores (como entidades principales)
Luego, la tabla "Nota de Venta" será una relación entre todos y debe tener:
Su propio ID
El ID del cliente
EL ID del vehículo
El ID del vendedor
Los datos propios a la nota de venta (fechas, importes, intereses, etc)
Tal y como te lo planteo, es necesario tener mantenimientos independientes:
Uno para Clientes
Otro para Vendedores
Otro para Vehículos
Posteriormente, en el formulario de Nota de Venta, seleccionar los que correspondan, ¿ok?
Con eso, conseguirás vincular todos los datos de forma sencilla.
Hola nuevamente...
Si mira, imagina que estoy frete al formulario de la nota de venta, en este formulario debe rellenarse primero la info del cliente, luego el vehículo que va a comprar, luego las condiciones de la compra o crédito (estos datos servirán para que se genere el convenio) y por ultimo quien le atendió, es decir el venderdor... Finalmente deben grabarse todos estos datos en las tablas correspondientes... ¿estoy bien con esto?, es decir, al intentarlo hacer de esta manera o me recomiendas hacerlo de otra manera... Esta idea la saque del formulario de nota de venta en papel...
Espero tus comentarios.
El problema es que no es lo mismo tal y como rellenas un formulario en papel que como se hace contra una base de datos.
Al intentar hacerlo como tu planteas (rellenando todos los datos a la vez) si no compruebas que las entidades que has anotado (cliente, vehículo y vendedor) ya existen, te puedes encontrar con registros duplicados.
Yo haría mantenimientos para cada uno:
Mantenimiento de Clientes
Mantenimiento de Vehículos
Mantenimiento de Vendedores
Posteriormente, en el formulario de Venta, seleccionaremos el que corresponda.
Si no encontráramos al Cliente, por ejemplo, iríamos al mantenimiento de clientes y lo daríamos de alta. Al regresar a la nota de venta, el cliente ya está creado, y puede ser referenciado.
Hola nuevamente...
Me queda claro lo de los mantenedores independientes para clientes, vendedores y vehículos... Las dudas las tengo con las tablas notavta y convenios...
¿Por ejemplo según lo que me indicaste estaría correcto lo siguiente?:
Tabla NotaVta
Idnotavta (autonum)
Idcliente
Idvehiculo
Numnotavta (int)
Fechavta (date)
Montocredito (int)
Cantcuotas (int)
Intcredito (int)
O igual hay que agregar el nombre, apellido, dirección, etc del cliente o basta con el idcliente... Lo mismo para el vehículo...
Tabla Convenios
Idconvenio (autonum)
Idnotavta
Numcuota (int)
Capital (int)
Interés (int)
Fpago (date)
Estatuota (var)
Recuerda que en esta tabla debo hacer los cálculos tomando como base campo de la tabla notavta (montocredito, cantcuotas, intcredito)... estos deben crearse también en la tabla convenios...
Es aquí donde siempre he tenido dudas, sobre que campos son los que me permiten acceder a la info de la otra tabla...
Espero tus comentarios.
Veo que en la Tabla NotaVta faltaría la referencia al Vendedor (Idvendedor, siguiendo tu nomenclatura).
No es necesario introducir en la Nota de Venta los datos del cliente, ni del vehículo, puesto que ya se encuentran en su tabla identificados por su ID.
Con respecto a la tabla Convenios, será el resultado de NumNota, con lo que solo debes referenciar Idnotavta tal y como plantear.
Entonces:
Tabla NotaVta
Idnotavta (autonum)
Idcliente
Idvehiculo
Numnotavta (int)
Fechavta (date)
Montocredito (int)
Cantcuotas (int)
Intcredito (int)
Tabla Convenios
Idconvenio (autonum)
Idnotavta
Numcuota (int)
Capital (int)
Interés (int)
Fpago (date)
Estatuota (var)
¿Están correctas estas estructuras según tu apreciación?... ¿En phpmyadmin debo hacer algún cambio con respecto a los campos id de estas tablas?
Espero tus comentarios..
Considero que la estructura es totalmente funcional.
Respuesta
1
El tema de las relaciones no es muy difícil, pero hay que tener en cuenta los tipos y actuar en consecuencia. En Internet tienes mucha documentación sobre tipos de relaciones y demás.
Normalmente se utiliza la relación uno a muchos, por ejemplo, en la tabla convenios tendrías un campo que sería el identificador de cliente, esto te relacionaría dichas tablas.
Además te recomiendo que los campos los llames: id para los identificadores y <nombre de tabla>_id para los campos relacionados. Así, la tabla convenios sería:
Id
Numcuota
Capital
Interés
Fpago
Estutoa
cliente_id
En MySQL, si trabajas con tablas InnoDB puedes definir las relaciones, si no tendrás que comprobar que se cumple la integridad referencial desde el propio programa.
Primero, gracias por responder...
Lo, segun entendi a cada tabla a relacionar (tabla hija) debo agregarle un campo de la otra tabla (tabla padre) y q ese campo debo nombrarlo con la sintanxis id<nombretabla>. ¿Lo otro al momento de crear ese campo este debe ser del mismo tipo que en la tabla padre cierto?. ¿La otra duda en la tabla hija a este campo basta con darle el mismo nombre que en la tabla padre o debo indicar alguna otra propiedad?...
A ver si entendí:
Tabla Clientes
Idcli (autonum)
Rut (var)
Dv (var)
Nombre (var)
Apellidos (var)
Tabla NotaVta
Idnotavta (autonum)
Idcli
Idvehiculo
Idvendedor
Numnotavta (int)
Fechavta (date)
Montocredito (int)
Cantcuotas (int)
Intcredito (int)
Tabla Convenios
Idconvenio (autonum)
Idnotavta
Numcuota (int)
Capital (int)
Interés (int)
Fpago (date)
Estatuota (var)
Tabla Vehículos
Idvehiculo (autonum)
Marca (var)
Modelo (var)
Valor (int)
Tabla Vendedor
Id vendedor (autonum)
Rut (int)
Nombre (var)
Apellido (var)
Comisión (double)
Espero tus comentarios y muchas gracias nuevamente...
Yo personalmente prefiero llamarle <nombre de la tabla>_id, por supuesto del mismo tipo. El nombre del campo es indiferente, pero si lo llamas como te digo estarás dentro de los estándares de muchos Frameworks tipo Zend Framework, Cake, etc. y te será más fácil identificar las relaciones en el futuro.
En caso de estar utilizando InnoDB como tipo de tabla, puedes crear las relaciones con FOREING KEY (en la documentación está explicada la sintaxis).
Entiendo y agradezco tus recomendaciones... y respecto a mis estructuras que opinas están bien...
Espero tu comentario...
Para poder diseñar una base de datos hay que conocer en profundidad el problema. Aparentemente están bien, yo personalmente pondría los nombres en minúscula, sin espacios y para los datos de tipo moneda utilizaría el tipo de datos "decimal".
Muchas gracias... Eres super claro para explicar...
¿Ahora ne phpmyadmin no debo realizar ninguna acción sobre los campos id que agregue en notavta y convenios?... es decir, indicar claves foráneas, indices, integridad, etc... pregunto, porque recién leí en un foro sobre esto pero no entendí mucho...
Espero tu comentarios..
Sí, los campos id tienes que crearlos como clave primaria. Luego en las tablas relacionadas, los campos <nombre_tabla>_id como claves foráneas enlazadas al campo id de la tabla "padre".
Respuesta
1
Bueno primero debes tener en cuanta la normalización de modelacion de datos:
http://es.wikipedia.org/wiki/Clave_ajena
Por ejemplo una de ellas es que las tablas deben nombrarse siempre en singular osea "Cliente" y no "Clientes".
Se que necesitas ayuda pero debemos ir poco a poco así que fórmula una pregunta más concreta para poderte ayudar y así ir avanzando.
Hola, primero gracias por responder...
No entiendo respecto a la forma en como debo formular la pregunta pero aquí va...
En estas tablas como debo crear las relaciones:
Tabla NotaVta
Idnotavta (autonum)
Numnotavta (int)
Fechavta (date)
Montocredito (int)
Cantcuotas (int)
Intcredito (int)
Tabla Convenio
Idconvenio (autonum)
Numcuota (int)
Capital (int)
Interés (int)
Fpago (date)
Estatuota (var)
Tabla Vendedor
Id vendedor (autonum)
Rut (int)
Nombre (var)
Apellido (var)
Comisión (double)
La idea es que al crear la nota de venta, me permita ingresar los datos del cliente que realiza la compra y obtiene el crédito y los datos del vehículo que esta comprando...
Espero tus comentarios.
Ok en las tablas debes tener datos relacionados a esa entidad por ejemplo puedes tener una tabla persona y ahí agregas los atributos relacionados con una persona como nombre apellido etc... y puedes tener una tabla cliente que este relacionada con la tabla persona y así no tienes que tener en la tabla cliente los atributos repetidos como nombre y apellido ya que los tienes en la tabla persona lo que tienes es que tener los id de las personas que son clientes y listo... más o menos por ahí va la cosa... pero claro eso depende de la lógica de negocio que son las que verdaderamente dicen las relaciones y las restricciones del modelo.
En tu caso tienes que agregar los id de las otras tablas en la tabla nota_venta :
nota_venta
id_nota_venta (autonum)
id_vendedor
id_cliente
id_vehiculo
numero_nota_venta (int)
fecha_venta (date)
monto_credito (int)
cantidad_cuotas (int)
Crédito (int)
Por id_ciente y id_vehiculo que son claves foráneas de tabla_cliente y tabla_vehiculo respectivamente, obtienes el cliente y el vehículo relacionado con la nota de venta... claro para realizar esto debes tener primero guardado en BD al cliente y el vehículo.
El tema de modelo de datos es bastante amplio así que bueno sera ir ayudante poco a poco pero de verdad te recomiendo leas primero la normalización para que tengas un mejor modelo, por ejemplo como ves yo no coloque 'idnotavta' sino 'id_nota_venta' entre más legible sean las entidades sera más fácil su documentación.
Ok... a ver si entendí... Ahora tengo lo siguiente:
Tabla NotaVta
id_nota_vta (autonum)
id_cli
id_vehiculo
id_vendedor
Num_nota_vta (int)
Fechavta (date)
Monto_credito (int)
Cant_cuotas (int)
Int_credito (int)
Tabla Convenios
Id_convenio (autonum)
id_nota_vta
id_cli (estoy en duda si va o no ya q tambien esta en la tabla notavta)
Num_cuota (int)
Capital (int)
Interés (int)
Fpago (date)
Estat_cuota (var)
Espero comentarios... y gracias...
Exactamente por ahí va la cosa.
Respuesta
1
Em mysql, se manejan las relaciones con la instrucción foreign key, te adjunto un pequeño código donde se muestra el código (DE LO QUE PUDE OBSERVAR Y ENTENDERTE, NO SE SI TE ENTENDÍ BIEN TU IDEA), notaras que esta la instrucción que crea las relaciones entre tablas, espero te sea de ayuda.
Create table cliente (
Idcli bigint not null auto_increment,
rut varchar(20) not null,
dv varchar(1),
nombre varchar(100) not null,
apellidos varchar(100) not null,
primary key (idcli)
) engine = innodb;
Create table vehiculo (
Idvehiculo bigint not null auto_increment,
marca varchar(50) not null,
modelo varchar(50) not null,
valor int not null,
primary key (idvehiculo)
) engine = innodb;
Create table vendedor (
Idvendedor_ bigint not null auto_increment,
rut varchar(20) not null,
nombres varchar(100) not null,
apellidos varchar(100) not null,
comision double not null,
primary key (idvendedor_)
) engine = innodb;
create table notavta (
 idnotavta bigint not null auto_increment,
 idcli bigint not null,
 idvendedor_ bigint not null,
 idvehiculo bigint not null,
 numnotavta int not null,
 fechavta date not null,
 montocredito int not null,
 cantcuotas int not null,
 intcredito int not null,
 primary key (idnotavta),
 foreign key (idcli) references cliente (idcli) on delete  restrict on update  restrict,
 foreign key (idvendedor_) references vendedor (idvendedor_) on delete  restrict on update  restrict,
 foreign key (idvehiculo) references vehiculo (idvehiculo) on delete  restrict on update  restrict
) engine = innodb;
create table convenio (
 idconvenio bigint not null auto_increment,
 numcuota int not null,
 capital int not null,
 interes int not null,
 fpago date not null,
 estatuota varchar(20) not null,
 idnotavta bigint not null,
 primary key (idconvenio),
 foreign key (idnotavta) references notavta (idnotavta) on delete  restrict on update  restrict
) engine = innodb;
Hola.. muchas gracias por responder... En la tabla convenio indicas como clave foránea el campo idnotavta de la tabla notavta, pero no mencionas ese campo dentro de la estructura, a diferencia de la tabla notavta donde mencionas el idcli y otros y también en las claves foráneas... ¿por qué esa diferencia...?
Gracias... Espero tus comentarios
Te voy a enviar una gráfica explicativa a tu mail.
GENIAL... revise el correo y la gráfica me explica todo... me entendiste super bien... y como hago ese tipo de estructuras ya que en el phpmyadmin no logo encontrar algo parecido...
Me queda más claro si veo el esquema de las relaciones... que ir haciendo todo manual o por código... esto igual tiene su ciencia... jejejeje..
Me recomiendas algún programa... y que luego exporte el diseño a mysql.. ¿es mucho soñar que exista un programa así?..
Espero comentarios...
Hmm claro hay muchas herramientas CASE como esta, por ejemplo:
case studio
Er studio de embarcadero
Visio de microsoft (muy funcional con sql server)
Entre otros que en este momento no recuerdo el nombre y que en ocasiones he llegaro a utilizar.
el grafico esta trabajado con case studio. Pero aparte de la herramienta es recomendable tener el conocimiento básico sobre diseño de bases de datos.
Respuesta
1
No entiendo bien tu pregunta. ¿Qué es lo que necesitas? ¿Soporte para phpmyadmin? ¿O qué te sugiera si están bien creadas las tablas? Explicate algo más
Respuesta
1
Perdona mi demora en responder, pero ando un poco enredado.
Respecto a tu pregunta te puedo decir que en los 2 años que llevo trabajando con Mysql nunca he creado relaciones, al menos no explícitamente, eso si me he asegurado que las tablas tengan las columnas necesarias para las relaciones, por ejemplo en tu caso, tienes una tabla para manejar las ventas de vehículos pero en esta tabla no existe el campo idvehiculo, te pregunto como vas a saber a cual vehículo pertenece esa venta, ¿y más aun a que cliente? Creo que antes de seguir deberías empezar por leer los siguientes links, los cuales tienen teoría de bases de datos.
http://es.wikipedia.org/wiki/Base_de_datos
http://www.programacion.com/bbdd/tutorial/entidadrelacion/
http://www.programacion.com/bbdd/tutorial/modrel/
http://www.sqlmax.com/centro/programa.asp

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas