Foros del Web » Programando para Internet » ASP Clásico »

Sistema de usuarios + articulos favoritos

Estas en el tema de Sistema de usuarios + articulos favoritos en el foro de ASP Clásico en Foros del Web. Hello again!!! Señores, quiero consultarles un problema. Tengo una web con articulos de recetas de cocina. Los usuarios pueden registrarse y guardar sus recetas favoritas ...
  #1 (permalink)  
Antiguo 01/03/2006, 14:18
 
Fecha de Ingreso: abril-2002
Mensajes: 83
Antigüedad: 23 años
Puntos: 1
Sistema de usuarios + articulos favoritos

Hello again!!! Señores, quiero consultarles un problema. Tengo una web con articulos de recetas de cocina. Los usuarios pueden registrarse y guardar sus recetas favoritas en una DB... todo iba bien hasta que me di cuenta que algunas recetas aparecen en la cuenta de otros usuarios.

Lo que pasa es que tengo 2 BD: una de las recetas, y otra de los datos de los usuarios. En la BD de las recetas creé un campo llamado "user" en donde se guardaban los id de los users, separados por un espacio entre si, y luego que el usuario seleccionaba una receta, se guardaba en el campo "user".

Ej.: la receta pastel tiene de ID 159, y cuando un usuario le daba a guardar en favoritos, en el campo user de esa fila se guardaba el ID del user, en este caso, digamos 5. Luego si otro usuario guardaba la misma receta, en el campo user quedaba este nuevo valor: 8 5. Y si un tercero hacia lo mismo, quedaba asi: 11 8 5...

Cuando el usuario se logueaba, en su pagina de favoritos habia un "Select receta from libro where user like " & user.. algo mas o menos asi

Todo bien hasta ahí, hasta que llegue a tener 213 usuarios, y como yo seleccionaba todo con un like, cuando el usuario 1 entra a su pagina de favoritos, selecciona no solo las recetas que en user tengan valor 1, sino que tambien toma la de valor parecido, como: 11, 21, 131, en fin....

Como puedo hacer un sistema de usuarios, y que cada uno de estos pueda guardar de manera eficiente algun o algunos articulos de recetas favoritos? Puede alguien darme los pasos, o una buena guia, please?

Creo que lo eché todo a perder... Alguien puede ayudarme? en verdad necesito la ayuda con extrema ugencia... Gracias de antemano..

Eduardo
  #2 (permalink)  
Antiguo 01/03/2006, 16:48
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 23 años, 3 meses
Puntos: 98
El primer consejo es que debes aprender a normalizar tus bases de datos, lo que hiciste despertó a los demonios de las bases de datos relacionales y de seguro necesitarás un exorcismo

En realidad la relación usuarios - recetas, debería ser mediante una tabla cruzada:

Un usuario puede seleccionar muchas recetas
Una receta puede ser seleccionada por muchos usuarios

Código:
tbl_usuario
id
1
2

tbl_receta
id
10
11
12

xref_usuario_receta
id_usuario   |  id_receta
1                     10
1                     12
2                     10
Ahora si todo está ordenado, el usuario 1 seleccionó las recetas 10 y 12, mientras que el usuario 2 seleccionó la receta 10.

Y así los demonios se quedan tranquilos.

Saludos!
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #3 (permalink)  
Antiguo 01/03/2006, 16:55
Avatar de meru-kun  
Fecha de Ingreso: noviembre-2002
Ubicación: Madrid
Mensajes: 854
Antigüedad: 22 años, 4 meses
Puntos: 0
u_goldman, entonces, es mejor crear una tabla aparte en la que se relacionen ambos campos que no crear un campo con todos los usuarios por cada receta?

Es que yo tenia planeado algo parecido, y lo iba a hacer como él lo está diciendo.

Como se nota cuando uno hace las cosas como mejor le suenan (mi caso), y cuando se hacen sabiendo (los maestros).
__________________
Tu portal de manga y anime.
  #4 (permalink)  
Antiguo 01/03/2006, 16:57
 
Fecha de Ingreso: abril-2002
Mensajes: 83
Antigüedad: 23 años
Puntos: 1
Goldman, y como hago eso que dices? en verdad estoy interesado en aprender... podrias ayudarme o enseñarme?
  #5 (permalink)  
Antiguo 01/03/2006, 17:59
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 23 años, 3 meses
Puntos: 98
Cita:
u_goldman, entonces, es mejor crear una tabla aparte en la que se relacionen ambos campos que no crear un campo con todos los usuarios por cada receta?
Hola Meru, sí, si es una relación muchos a muchos como es el caso, para las relaciones uno a uno, el id de la tabla de uno pasa a la tabla de muchos como una llave foránea

En resumen, hay que entender la relación que tenemos entre nuestras entidades.

Acuérdense que una de las reglas de las bases de datos relacionales es no guardar arreglos, ni ningún otro tipo de dato que tengamos que descomponer o que se pueda calcular.

Eldan, específicamente que es lo que necesitas saber?
El problema es la forma en la cual resolviste tu problema, así que la solución que yo encuentro, es volviendo a hacer ese sistema :S lo siento...la estructura está ahí ya solo sería cuestión de que hagas tu parte lógica (INSERT, DELETE, SELECT), las sentencias JOIN te ayudarán para este propósito.


Saludos.
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #6 (permalink)  
Antiguo 01/03/2006, 18:51
 
Fecha de Ingreso: abril-2002
Mensajes: 83
Antigüedad: 23 años
Puntos: 1
sentencia JOIN? jamas la habia escuchado... quisiera saber como puedo hacer eso, ya que mi trabajo depende de eso.... jejeje, k cosas de la vida, no?
  #7 (permalink)  
Antiguo 01/03/2006, 19:06
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 23 años, 3 meses
Puntos: 98
Ok, entonces es más sencillo como te dije, específicamente que quieres hacer?

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #8 (permalink)  
Antiguo 01/03/2006, 19:14
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 2 meses
Puntos: 146
1) Entender que es SQL

2) Un libro básico, básico

2) Un libro ya más o menos o un tutorial.

3) Dudas específicas, pues con un buscador, especificamente en este caso, el inner join

Saludos
  #9 (permalink)  
Antiguo 02/03/2006, 07:15
 
Fecha de Ingreso: abril-2002
Mensajes: 83
Antigüedad: 23 años
Puntos: 1
Bueno Goldman, lo que quiero hacer es lo siguiente: quiero crear un sistema de usuarios, que se puedan registrar y loguearse. Asi mismo, tengo una base de datos con recetas que se agregan de manera periodica.

Lo que quiero hacer es que cuando un usuario se loguee, tenga la posibilidad de tener algunas recetas como "favoritas", es decir, que cuando se loguea y va a su seccion, aparezcan las recetas favoritas que haya agregado a su lista hasta el momento.

Me darias una mano con esto? Si no me expliqué bien, avisame please...
  #10 (permalink)  
Antiguo 02/03/2006, 10:25
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 23 años, 3 meses
Puntos: 98
ok...y que parte es la que no puedes hacer?
Básicamente tu tienes todo eso hecho menos la parte de insertar y recuperar las recetas no?

Es relativamente fácil esto, antes que nada necesitas hacer un insert por cada receta que el usuario selecionó

Según la estructura propuesta:

Código:
usuario_id = valor
receta_id = valor

qry = "INSERT INTO xref_usuario_receta VALUES("&usuario_id&", "&receta_id&")"
Recuperar las recetas en base a un usuario_id
Código:
usuario_id = valor

qry = "SELECT a.receta_id, a.receta_nombre FROM tbl_recetas a INNER JOIN xref_usuario_receta b ON a.receta_id = b.receta_id WHERE b.usuario_id ="& usuario_id

'Si queremos ser mas quisquillosos todavía podríamos unir la tabla de usuarios 
'y preguntar por el usuario cuyo id = usuario_id

Set rs = ObjConn.Execute(qry)

if not rs.EOF then
  'iteras tu recordset
else
  'No hay registros
end if
Obviamente después necesitarás controlar más cosas como borrar las recetas de la tabla de relación si borras recetas de tbl_recetas, etc....

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #11 (permalink)  
Antiguo 02/03/2006, 10:39
 
Fecha de Ingreso: abril-2002
Mensajes: 83
Antigüedad: 23 años
Puntos: 1
ok, hasta ahora tengo lo siguiente: 2 base de datos diferentes. En la primera estan todas las recetas. En la segunda la info de todos los usuarios.

- En cual base de datos guardaré la informacion de las recetas favoritas?
- Debo crear alguna tabla nueva, o una DB nueva?
- Que pasará cuando otro usuario guarde esa misma receta?
- Se crearan mas campos para las nuevas recetas añadidas en favoritos?

En verdad este tema me interesa y estoy aprendiendo mucho con todo lo que has escrito, Goldman.

Ademas que espero poder trabajar con esto luego de seguirte leyendo. Muchas gracias por contestar mis dudas.

Eduardo
  #12 (permalink)  
Antiguo 02/03/2006, 10:44
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 23 años, 3 meses
Puntos: 98
Y hay alguna razon especifica para que tengas 2 bases de datos??
En realidad a menos que no sea extrictamente necesario, no deberías tener dos bases de datos para esto...con una base de datos y todas sus tablas sería suficiente.

Saludos.
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #13 (permalink)  
Antiguo 02/03/2006, 10:47
 
Fecha de Ingreso: abril-2002
Mensajes: 83
Antigüedad: 23 años
Puntos: 1
jejejeje, creo que la primera razón es porque soy muy novato en esto. La segunda, creo que se me cruzó por la cabeza tener 2 bases de datos para no cargar demasiado una sola. Y la tercera, creo que tiene que ver con la primera razon: soy novato, y no encontré ayuda.

Pero tú aconséjame y en el acto haré todo lo que esté en mis posibilidades para desarrollar nuevamente esta aplicación.
  #14 (permalink)  
Antiguo 02/03/2006, 15:09
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 23 años, 3 meses
Puntos: 98
Bueno, entonces por favor, crea esas tablas en una sola base de datos y comienza a trabajar en tu lógica como ya lo hablamos.

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #15 (permalink)  
Antiguo 02/03/2006, 15:11
 
Fecha de Ingreso: abril-2002
Mensajes: 83
Antigüedad: 23 años
Puntos: 1
Pero suponiendo que ya tengo todo en 1 sola base de datos, que hago despues? como puedo trabajar en la logica de las sentencias SQL? es que estoy un poco perdido en cuanto a eso...
  #16 (permalink)  
Antiguo 02/03/2006, 15:50
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 23 años, 3 meses
Puntos: 98
Eldan, un poco de voluntad de ayudará mucho, ve el post #10, y comenta concretamente que es lo que no entiendes.

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #17 (permalink)  
Antiguo 02/03/2006, 15:57
 
Fecha de Ingreso: abril-2002
Mensajes: 83
Antigüedad: 23 años
Puntos: 1
ok, procederé a enumerar lo que no entiendo:

1 - no entiendo en que tabla he de insertar ese query, si en la tabla de recetas o de usuarios.

2 - Como hacer ese inner join.. no entiendo las variables y me pierdo tratando de interpretarlas.

3 - ese valor se guardará en un campo, o como es?

Creeme que si le estoy echando ganas, y quiero poner mas de mi parte. Me exigiré tanto como sea necesario para lograr esto. En serio estoy dispuesto a aprender.
  #18 (permalink)  
Antiguo 02/03/2006, 16:22
Avatar de gorka_arai  
Fecha de Ingreso: octubre-2005
Mensajes: 281
Antigüedad: 19 años, 5 meses
Puntos: 1
U_goldman, con tu permiso te relevaré un poquillo en las labores pedagógicas...

Cita:
Iniciado por Edan16
ok, procederé a enumerar lo que no entiendo:

1 - no entiendo en que tabla he de insertar ese query, si en la tabla de recetas o de usuarios.

2 - Como hacer ese inner join.. no entiendo las variables y me pierdo tratando de interpretarlas.

3 - ese valor se guardará en un campo, o como es?
1 - Si miras atentamente la sentencia sql, te darás cuenta de que ese query introduce datos en la tabla intermedia. Oséase: "xref_usuario_receta".
2 - Pos tal y como lo pone el buen u_goldman... (INNER JOIN es una manera de emparejar tablas indexadas)
3 - ¿A qué valor te refieres?
  #19 (permalink)  
Antiguo 02/03/2006, 22:45
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 23 años, 3 meses
Puntos: 98
Gracias gorka!

Bueno, para redondear, esos valores, los puedes obtener de cualquier lado...por eso es que simplemente le asigné un valor a esas dos entradas, podrías obtenerlo de un querystring o de un campo en un formulario, o de tu base de datos, es de mi entender, que si ya tienes tu sistema de usuarios y ese usuario ya pasaba un valor para dar de alta la receta, puedes utilizar la misma interfaz solo adecuando la parte del manejo de los datos.

Saludos.
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #20 (permalink)  
Antiguo 07/03/2006, 07:51
 
Fecha de Ingreso: abril-2002
Mensajes: 83
Antigüedad: 23 años
Puntos: 1
Goldman, te quiero agradecer por todo (y a los demas que postearon en este mensaje). Pude resolver el problema. Lei tu sentencia y el manual de Inner Join que puse Myakire y lo logré. Tambien creé la nueva tabla con los datos, y todo fue un éxito.

La sentencia que use para corregir todo fue:

sSQL="SELECT * FROM recetas INNER JOIN user_receta ON recetas.ID = user_receta.receta_id WHERE user_receta.user_id = " & user & " ORDER BY ID desc"

y hasta ahora me ha funcionado. Si ves un error en ese codigo, avisame. Gracias por tu ayuda y la de las demas personas que se interesaron en este post. Ahora tengo el reto de crear la forma de eliminar las recetas.

Gracias por todo.

Eduardo
  #21 (permalink)  
Antiguo 07/03/2006, 08:17
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 2 meses
Puntos: 146
Cita:
Goldman, te quiero agradecer por todo (y a los demas que postearon en este mensaje). Pude resolver el problema. Lei tu sentencia y el manual de Inner Join que puse Myakire y lo logré. Tambien creé la nueva tabla con los datos, y todo fue un éxito.
esa es la actitud que se necesita seguro no tendrás problemas para el borrar las recetas.

Pero solo como tip, puedes listar todas las recetas con un checkbox a un lado con el value igual a su clave de receta. Luego, en el submit haces una sentencia delete como la siguiente:

sql = "delete from tabla where IdReceta in ("&request("claves")&")"

solo no olvides colocarles de nombre a todos los checkbox, en este caso la palabra "claves"

Saludos
  #22 (permalink)  
Antiguo 07/03/2006, 08:21
 
Fecha de Ingreso: abril-2002
Mensajes: 83
Antigüedad: 23 años
Puntos: 1
gracias por esa sugerencia. Me parece buenisima. Gracias por tu ayuda. Es bien interesante eso...
  #23 (permalink)  
Antiguo 07/03/2006, 08:52
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 23 años, 3 meses
Puntos: 98
Alguien dijo salud?
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #24 (permalink)  
Antiguo 07/03/2006, 08:58
Avatar de gorka_arai  
Fecha de Ingreso: octubre-2005
Mensajes: 281
Antigüedad: 19 años, 5 meses
Puntos: 1
Si es que sois unos mostruos...
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 17:59.