Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

ayuda para estructurar las tablas de proyecto

Estas en el tema de ayuda para estructurar las tablas de proyecto en el foro de Mysql en Foros del Web. Hola, quisiera saber que opinan ustedes de la estructura que les he dado a mis tablas para la aplicacion que quiero crear, es bienvenido todo ...
  #1 (permalink)  
Antiguo 02/07/2009, 00:11
Avatar de XLora  
Fecha de Ingreso: diciembre-2007
Ubicación: Dallas Tx. USA
Mensajes: 100
Antigüedad: 16 años, 4 meses
Puntos: 3
Pregunta ayuda para estructurar las tablas de proyecto

Hola, quisiera saber que opinan ustedes de la estructura que les he dado a mis tablas para la aplicacion que quiero crear, es bienvenido todo tipo de aporte ya sean cristicas, opiniones, referencias, ayuda, comentarios, etc.

Para empezar les explicare un poco acerca del proyecto, será una aplicación atravez de la cual los usuarios podrán inscribir sus compañías o negocios (uno o mas), sera mas o menos como una página amarilla, podrán ingresar datos de sus compañías como el nombre, dueño, telefono, email, estado y ciudad en donde se encuentra, texto como por ejemplo ¿quienes somos?, ¿por qué elegirnos? y a que categoría y subcategoría pertenece, además podrán elegir un nombre de subdominio del tipo www.miaplicación.com/mynegocio y allí se podrá poner 1 banner algo grande, 3 fotos mas pequeñas a la izquierda, un mapa de la ubicación de la empresa y 1 Thumbails que aparecera cuando las personas hagan busquedas en el sitio, bueno todo esto resumidamente, no quiero aburrirlos...

Por el momento he pensado en la siguiente estructura de tablas, observen por favor la estructura y el tipo de datos que le di a cada campo (columna), si en algo estoy mal no duden en decirmelo se los agradecere mucho, bueno aqui van las tablas (son varias):

1.- Tabla "usuarios"
id_usuario int unsigned not null auto_increment primary key,
nombre char(25) not null,
apellido char(30) not null,
usuario char(15) not null, // Este será el nombre de usuario, el alias, apodo, etc
clave char(40) not null,
telefono1 char(15) not null,
telefono2 char(15), // El telefono2 sera opcional
email char(50) not null

2.- Tabla "negocios"
id_negocio int unsigned not null auto_increment,
id_usuario int not null, // clave secundaria ligada a usuarios.id_usuario
n_negocio char(30) not null, // nombre del negocio
id_pais int not null, // clave secundaria ligada a tabla paises.id_pais
id_estado int not null, // clave secundaria ligada a tabla estados.id_estado
id_ciudad int not null, // clave secundaria ligada a tabla ciudades.id_ciudad
cp char(10) not null, // codigo postal
id_categoria int not null, // clave secundaria ligada a tabla categorias.id_categoria
id_subcategoria int not null, // clave secundaria ligada a tabla subcategorias.id_subcategoria
inscripcion date not null, // fecha en la cual se inscribio el negocio
primary key (id_negocio, id_usuario, id_pais, id_estado, id_ciudad, id_categoria, id_subcategoria)

3.- Tabla "info_negocios"
id_negocio int not null primary key, // clave secundaria ligada a negocios.id_negocio
propietario char(50), // dueño de la empresa, compañía o negocio
telefono1 int not null, // los telefonos del negocio pueden ser diferentes a los de el usuario
telefono2 int, // el telefono2 sera opcional
email char(50), // el email del negocio puede ser diferente que el de el usuario
website varchar(255),
direccion varchar(255) // dirección fisica, calle, no°, avenida, etc...

4.- Tabla "subdominios"
id_subdominio int unsigned not null auto_increment primary key,
id_negocio int not null, // clave secundaria ligada a tabla negocios.id_negocio
n_subdominio char(30) not null // nombre del subdominio

5.- Tabla "categorias"
id_categoria int unsigned not null auto_increment primary key,
n_categoria char(50) not null // nombre de la categoria

6.- Tabla "subcategorias"
id_subcategoria int unsigned not null auto_increment primary key, // clave secundaria a tabla categorias.id_categoria
n_subcategoria char(50) not null // nombre de la subcategoria

7.- Tabla "paises"
id_pais int unsigned not null auto_increment primary key,
n_pais char(25) not null // nombre del pais

8.- Tabla "estados"
id_estado int unsigned not null auto_increment primary key,
id_pais int not null, // clave secundaria ligada a tabla paises.id_pais
n_estado char(25) not null // nombre del estado

9.- Tabla "ciudades"
id_ciudad int unsigned not null auto_increment primary key,
id_estado int not null, // clave secundaria ligada a tabla estados.id_estado
n_ciudad char(25) not null // nombre de la ciudad


Con esta estructura pretendo poder permitir lo siguiente:

1.- Cualquier persona puede inscribirse como usuario y puede inscribir a tantos negocios como quiera, lo que significa que podra configurar todos los subdominios que necesite y asi mismo podra configurar a que categoria y subcategoria pertenece cada negocio ademas de en que pais, estado y ciudad se encuentra el negocio.
2.- Puede ser que el usuario quiera establecer 2 numeros de telefonos (el primero es obligatorio) personales para que yo me pueda comunicarme con el, aunque puede ser que los numeros de telefono que quiera poner para el o los negocios sean diferentes, al igual que los correos electronicos, uno sera para establecer comunicacion entre la aplicacion y el usuario y el otro para recibir pedidos, reclamos o lo que sea de parte del cliente. Si no se introdujere telefonos y email para los campos (columnas) del negocio, entonces se estableceran como predeterminados los numeros de telefono y dirección de correo electronico que esten escritos en los campos (columnas) de la tabla usuarios.
3.- Las personas podran navegar por las categorias y subcategorias, seleccionando asi de la base de datos solo los negocios que sean validos para dichas categorias y subcategorias, ademas puede ser que el usuario quiera filtrar los datos por pais, estado, ciudad y codigo postal.
4.- Los usuarios podran hacer busquedas sencillas de lo que estan buscando y en donde, asi como busquedas avanzadas de lo que estan buscando, en que pais, estado, ciudad, codigo postal (opcional).

Tengo algunas dudas como las siguientes:

1.- Necesito saber o controlar que un usuario no duplique a la misma empresa 2 veces, es decir, puede inscribir muchos negocios diferentes pero no al mismo, ¿como lo compruebo?
2. En base a la opcion 3 de mas arriba, realmente no quiero permitir que naveguen en categorias y subcategorias de forma global, es decir, que se seleccione de toda la base de datos todos los negocios de cierta categoria y subcategoria, ya que esto alentaria a la base de datos, ademas de que creo que las personas quieren encontrar lo que sea que buscan cerca de ellos, por esto mismo quiero saber ¿como le hago para que desde antes puedan establecer un pais, estado y ciudad en la cual navegar por categorias?, de esta manera solo se seleccionaran los negocios que esten cerca de ellos y asi restar trabajo a la base de datos.
3.- Necesito implementar un control de pagos mensuales por los servicios (por cierto a muy bajo costo), para esto veo 2 opciones, cobrar cada que un cliente cumpla 1 mes de servicios, lo cual significa que posiblemente me tocara cobrarles cada dia a personas diferentes en diferentes lugares (si tienen tarjetas de credito creo que no es mucho problema ya que podrian hacerlo online), la otra opción es establecer fechas fijas como cada dia 15 de cualquier mes o cada dia 30 de cualquier mes, incluso ambas para compartir la carga en la aplicación (por los pagos con tarjeta de credito online) y para compartir el trabajo de cobrar personalmente. Para ser honesto me agrada mas la ultima opcion de establecer dias fijo como cada 15 y 30 (ambos), en este caso ¿como le puedo hacer para saber a que personas les toca pagar el 15 y aque otras el 30? necesito que me expliquen y que me ayuden con la estructura de dichas tablas.
4.- Por el momento no se como ordenar los resultados devueltos desde una busqueda del usuario, he pensado en ordenarlos por fecha de inscripcion, es decir, que aparescan primero los negocios que se inscribieron primero y al ultimo los que se han inscrito despues, aunque el usuario puede ordenarlos en sentido inverso a este, ademas de que pueda ordernarlos alfabeticamente por el nombre ascendente o descendente o por el codigo postal de manera ascendente o descendente. La verdad es que pensaba en alguna manera de permitir a mis clientes que al inscribir a sus compañias puedan incluir palabras claves y una descripcion para sus negocios, y de esta manera poder implementar un sistema de busqueda interno que permita un mejor orden en la presentación de los resultados cuando un usuario realiza una busqueda (solamente para las busquedas, no para la navegación de categorias), la descripcion tambien apareceria en los resultados de busqueda interna y tambien servirian para agregarlas a la etiqueta meta description del documento al igual que las palabras claves. Si este fuera el cso ¿como puedo hacer dicha tabla de descripcion y palabras claves, como la relaciono a los negocios y cual seria la logica del buscador interno para ordenar los resultados segun las palabras claves y la descripcion de los negocios.
5.- Necesito permitir la carga de archivos para las imagenes de cada negocio, el banner y las tre fotos extras, el mapa y el Thumbails, la pregunta es ¿cual seria la estructura de la tabla, como la relaciono con los negocios?

Por el momento es todo, gracias por sus tiempo, no es necesario que contesten a todas las preguntas, con un poco que aporten todos podrian ayudarme a solucionarlo todo.
  #2 (permalink)  
Antiguo 02/07/2009, 05:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: ayuda para estructurar las tablas de proyecto

1) Creas un índice UNIQUE con las claves de empresa y usuario. No se podrá repetir jamás la combinación. Pero un ID autoincrement para un negocio no sirve, debe usarse un campo que realmente pueda identificar al negocio en sí mismo, como por ejemplo, el número de inscripción que el mismo tenga en la agencia impositiva del país.
2. Eso es un problema de doble frente: La selección de parámetros es asunto de la aplicación, no de la base de datos, y es allí donde debes poner los filtros que permitan construir una consulta que sea más restrictiva. La consulta, por su parte debe ser parametrizable de modo de aceptar varias posibilidades de filtrado alternativo.
3 y 4. Estas preguntas muestran que las reglas del negocio (etapa de análisis de sistemas) no están definidas o no están bien analizadas. Se trata del tipo de cosas que debes plantear antes de diseñar el modelo de datos, no mientras lo haces. Trata de establecer bien todos los criterios de las reglas con que funciona o funcionará el comercio y luego verifica si el modelo de datos requiere cambios.
5. Una tabla de datos para representación puede ser una relación débil que requiere solamente el ID de la empresa y el ID del registro. Obviamente eso significa que cada registro de la tabla de datos se relaciona con la del negocio por medio de una FK referida al ID del negocio. Nada más.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/07/2009, 11:45
Avatar de XLora  
Fecha de Ingreso: diciembre-2007
Ubicación: Dallas Tx. USA
Mensajes: 100
Antigüedad: 16 años, 4 meses
Puntos: 3
Respuesta: ayuda para estructurar las tablas de proyecto

Cita:
Iniciado por gnzsoloyo Ver Mensaje
5. Una tabla de datos para representación puede ser una relación débil que requiere solamente el ID de la empresa y el ID del registro. Obviamente eso significa que cada registro de la tabla de datos se relaciona con la del negocio por medio de una FK referida al ID del negocio. Nada más.
Podrias explicarme un poco mas detalladamente esto?? No le entendi mucho...
  #4 (permalink)  
Antiguo 02/07/2009, 11:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: ayuda para estructurar las tablas de proyecto

Según dices:
Cita:
Necesito permitir la carga de archivos para las imagenes de cada negocio, el banner y las tre fotos extras, el mapa y el Thumbails, la pregunta es ¿cual seria la estructura de la tabla, como la relaciono con los negocios?
Estás hablando de una tabla que contenga campos con las direcciones de ubicación de los archivos de bitmap para ser usados en la página. Si se trata de un conjunto estable de datos, los puedes poner en una sola tabla
Fotos_Negocio(id_negocio, id_fotonegocio, foto1, foto2, foto3, banner, mapa, thumbails).
El primer campo en una clave foránea relacionada con la PK de la tabla negocio. El segundo campo permite crear más de un conjunto para el mismo negocio. Si no pones el segundo campo, entonces solo podrá haber un conjutno de esos datos por cada negocio.

Un tipo adicional es que la la clave id_negocio de todas las tablas que has puesto está mal respecto de la tabla "negocio", ya que la estás usando como FK, pero la PK de la tabla negocio es una clave múltiple que contiene (id_negocio, id_usuario, id_pais, id_estado, id_ciudad, id_categoria, id_subcategoria).
En realidad el problema es que definir una PK de ese tipo es innecesario en tu modelo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 02/07/2009, 16:22
Avatar de XLora  
Fecha de Ingreso: diciembre-2007
Ubicación: Dallas Tx. USA
Mensajes: 100
Antigüedad: 16 años, 4 meses
Puntos: 3
Respuesta: ayuda para estructurar las tablas de proyecto

Bien entendi lo de las fotos...

Ahora dime:
Cita:
Iniciado por gnzsoloyo Ver Mensaje
Un tipo adicional es que la la clave id_negocio de todas las tablas que has puesto está mal respecto de la tabla "negocio", ya que la estás usando como FK, pero la PK de la tabla negocio es una clave múltiple que contiene (id_negocio, id_usuario, id_pais, id_estado, id_ciudad, id_categoria, id_subcategoria).
En realidad el problema es que definir una PK de ese tipo es innecesario en tu modelo.
¿Por qué estan de mas las claves secundarias (FK) que he puesto? y ¿cómo debería de ir en realidad la(s) clave(s) ?

Haaaaaaa, muchas gracias por explicarme, gracias por tu tiempo.
  #6 (permalink)  
Antiguo 02/07/2009, 18:54
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: ayuda para estructurar las tablas de proyecto

Por definición, una clave primaria (Primary Key) es un campo, o mínimo conjunto de campos que identifica unívocamente un registro dado en una tabla.
Esto significa que para ser una clave primaria debe cumplir con:
1. No puede repetirse jamás (condición que por defecto cumple el campo id_negocio).
2. No puede ser NULL (condición que por defecto cumple el campo id_negocio).
3. Debe ser una expresión única o una combinación mínima de campos (condición que por defecto cumple el campo id_negocio).

Por ello es que definir una clave múltiple donde un sólo campo ya puede cumplir con ese rol, es innecesario e ineficiente.
En ese contexto, donde id_negocio es autoincremental, el resto de los campos son innecesarios para una PK. Además, una clave múltiple posee el inconveniente de para ser usada como clave foránea deben estar todos los campos de la clave en las tablas en donde se desee relacionar las dos tablas, ya que una FK apunta forzosamente a la clave completa y no a una parte de ella (3FN y 4FN).
Esto último significa que para que la FK en INFO_NEGOCIO fuera válida, no solamente requeriría el campo id_negocio, sino que le tienes que agregar además id_usuario, id_pais, id_estado, id_ciudad, id_categoria, id_subcategoria, que también son parte de la clave.

¿Se comprende la idea?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 06/07/2009, 11:54
Avatar de XLora  
Fecha de Ingreso: diciembre-2007
Ubicación: Dallas Tx. USA
Mensajes: 100
Antigüedad: 16 años, 4 meses
Puntos: 3
Respuesta: ayuda para estructurar las tablas de proyecto

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Se comprende la idea?
Si ya entendi.

Y bueno que me podrias decir del tamaño del tipo y del tamaño de los campos (columnas) que he declarado.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:37.