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

usuarios free / premium

Estas en el tema de usuarios free / premium en el foro de Mysql en Foros del Web. Hola, muy buenas. Estoy haciendo una BD más o menos seria por primera vez. Y ahora me estoy preocupando por las relaciones. Tal vez alguna ...
  #1 (permalink)  
Antiguo 01/03/2013, 08:13
 
Fecha de Ingreso: diciembre-2012
Mensajes: 21
Antigüedad: 11 años, 4 meses
Puntos: 0
usuarios free / premium

Hola, muy buenas. Estoy haciendo una BD más o menos seria por primera vez. Y ahora me estoy preocupando por las relaciones. Tal vez alguna pregunta parecida esté por ahí, pero no se ni que palabras clave usar para la búsqueda en el foro..

La pregunta que me ha surgido es la siguiente: Tengo planeado la tabla usuarios con un campo "premium". Si el usuario es premium los archivos que suba al servidor no se compartirán. En cambio, si es free, se compartirán con el resto de los usuarios.

El pseudocódigo seria (creo) algo asi:

if(select premium from users == YES){
insert into filespremium
}else(select premium from users == NO){
insert into filesfree
}


Mi problema es que no se si esto se puede hacer con una rutina de mysql. No se si con trigger valdría o con PHP. Siento la pregunta estúpida, pero no he usado un trigger nunca y no encuentro la manera de meter un select y un if dentro de un trigger before.

Pensaba hacer algo así, pero no creo que sea muy viable:

DELIMITER $$
TRIGGER files
BEFORE INSERT ON agora.filesfree
FOR EACH ROW
BEGIN
IF (SELECT premium FROM agora.users == “YES” )
INSERT INTO freefiles (…) VALUES (…);
ELSE
INSERT INTO premium (…) VALUES (…);
END IF;

END$$



Las tablas son estas. Muchas gracias!:

CREATE TABLE users(
userID INT(11) NOT NULL AUTO_INCREMENT,
user VARCHAR(20) NOT NULL,
password VARCHAR(10) NOT NULL,
premium ENUM ('YES', 'NO') NOT NULL DEFAULT 'NO',
uImgPath VARCHAR(10),
uGradation VARCHAR(15),
PRIMARY KEY (userID)
)ENGINE=INNODB;



CREATE TABLE filesfree(
fileFreeID BIGINT NOT NULL AUTO_INCREMENT,
ffPath TEXT NOT NULL,/*UNIQUE*/
ffType ENUM('IMAGE', 'VIDEO', 'PRESENTATION', 'DOCUMENT', 'WEB', 'NOTE', 'BOOK', 'AUDIO') NOT NULL,
ffName VARCHAR (20) NOT NULL,
ffDate DATE NOT NULL,
PRIMARY KEY (fileFreeID)
)ENGINE=INNODB;




CREATE TABLE filespremium(
filePremiumID BIGINT NOT NULL AUTO_INCREMENT,
fpPath TEXT NOT NULL,/*UNIQUE*/
fpType ENUM('IMAGE', 'VIDEO', 'PRESENTATION', 'DOCUMENT', 'WEB', 'NOTE', 'BOOK', 'AUDIO') NOT NULL,
fpName VARCHAR (20) NOT NULL,
fpDate DATE NOT NULL,
fpUploader INT NOT NULL,
PRIMARY KEY (filePremiumID),
INDEX (fpUploader),
FOREIGN KEY (fpUploader)
REFERENCES users(userID)
ON UPDATE CASCADE ON DELETE CASCADE
)ENGINE=INNODB;
  #2 (permalink)  
Antiguo 01/03/2013, 08:21
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, 4 meses
Puntos: 2658
Respuesta: usuarios free / premium

En realidad estás pifiándole al diseño.
Si tienes los mismos datos entre dos tablas, y la diferencia es procedural (unos se comparten y otros no), la solución no es crear dos tablas, sino darle un atributo adicional que indique si ese archivo se comparte o no.
Es decir, requeriría un campo que puede ser numérico o ENUM que permita filtrar los libres de los premium. Eso es todo.
Con eso, luego, en la aplicación simplemente parametrizas la consulta para buscar uno u otro.
__________________
¿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 01/03/2013, 08:25
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: usuarios free / premium

No te compliques es muy simple hacerlo en php....

Cuando logues al usuario ya puedes consultar si es premium o no, guardas ese dato en una variable de session o en el objeto usuario si estas trabajando con POO

Luego usas la variable para hacer ese condicional que propones en pseudo codigo ...

Código PHP:
Ver original
  1. if ($_SESSION['premium']){
  2.    $sql="INSERT INTO filespremium ...";
  3. }else{
  4.    $sql="INSERT INTO filesfree ...";
  5. }

$_SESSION['premium'] debe ser true o false.


Edito para que se vea que en el fondo no hay contradicción con gnzsoloyo, el te responde sobre el diseño de la bbdd y yo sobre como hacerlo.

Código PHP:
Ver original
  1. if ($_SESSION['premium']){
  2.    $tipoFile="1";// para premium
  3. }else{
  4. $tipoFile="2";// para free
  5. }
  6.    $sql="INSERT INTO files (...,tipoFile,..) VALUES (....,".$tipoFile.",...)";

Edito pensaba que estaba en el foro de php por eso he puesto codigo, pero se puede pasar a pseudocodigo... lo siento gnzsoloyo
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 01/03/2013 a las 08:35
  #4 (permalink)  
Antiguo 01/03/2013, 08:50
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, 4 meses
Puntos: 2658
Respuesta: usuarios free / premium

OK, Quimfv... por hoy, pasa.

__________________
¿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 01/03/2013, 10:03
 
Fecha de Ingreso: diciembre-2012
Mensajes: 21
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: usuarios free / premium

Muchas gracias.
Al principio lo planteé así, como decís. Pero después me compliqué porque los archivos de los usuarios premium se borran de la base de datos al darse estos de baja. Y por eso puse dos tablas, en la que los de los premium se borran todos los archivos en cascada. Supongo que no será tampoco muy complicado hacerlo "manualmente" cada vez que un usuario se borre.

Lo dicho, muchas gracias!
  #6 (permalink)  
Antiguo 01/03/2013, 10:11
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, 4 meses
Puntos: 2658
Respuesta: usuarios free / premium

Lo que te conviene es simplemente agregar un campo "fecha_baja", que sea nulable (pueda tener NULL), de modo de que si fue borrado, simplemente se agrega el parámetro
Código MySQL:
Ver original
  1. fecha_baja IS NOT NULL
, y ya ni siquiera aparecerá en la lista, pero además te permita mantener un historial de lo que se subió y por quien.
Ese es un método muy usual.
__________________
¿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 01/03/2013, 11:45
 
Fecha de Ingreso: diciembre-2012
Mensajes: 21
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: usuarios free / premium

Ok, muchas gracias
  #8 (permalink)  
Antiguo 03/03/2013, 13:04
 
Fecha de Ingreso: diciembre-2012
Mensajes: 21
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: usuarios free / premium

Ya siento ser pesado. Pero no soy capaz de hacer la lógica.

Las nuevas tablas, si he entendido bien:

CREATE TABLE users(
userID INT(11) NOT NULL AUTO_INCREMENT,
user VARCHAR(20) NOT NULL,
password VARCHAR(10) NOT NULL,
premium ENUM ('YES', 'NO') NOT NULL DEFAULT 'NO',
fecha_baja DATE NULL,
uImgPath VARCHAR(10),
uGradation VARCHAR(15),
PRIMARY KEY (userID)
)ENGINE=INNODB;



CREATE TABLE filespremium(
filePremiumID BIGINT NOT NULL AUTO_INCREMENT,
fpPath TEXT NOT NULL,/*UNIQUE*/
fpType ENUM('IMAGE', 'VIDEO', 'PRESENTATION', 'DOCUMENT', 'WEB', 'NOTE', 'BOOK', 'AUDIO') NOT NULL,
fpName VARCHAR (20) NOT NULL,
fpDate DATE NOT NULL,
fpPremium ENUM ('YES','NO') NOT NULL,
fpUploader INT NOT NULL,
PRIMARY KEY (filePremiumID),
INDEX (fpUploader),
FOREIGN KEY (fpUploader)
REFERENCES users(userID)
ON UPDATE CASCADE ON DELETE CASCADE
)ENGINE=INNODB;



Y cuando la variable "fecha_baja" de la tabla usuarios sea NOT NULL borro todos los archivos "premium" de los usuarios "premium". Algo asi:

IF (user.fecha_baja IS NOT NULL) THEN (Recorriendo "files" IF(user.ID = file.Uploader AND file.premium="YES") THEN (borra archivo) ).


Lo malo es que eso hay que ponerlo en un trigger, y creo que no es posible verdad?


He entendido bien lo que debía hacer?
Muchas gracias
  #9 (permalink)  
Antiguo 03/03/2013, 16:02
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, 4 meses
Puntos: 2658
Respuesta: usuarios free / premium

Cita:
Y cuando la variable "fecha_baja" de la tabla usuarios sea NOT NULL borro todos los archivos "premium" de los usuarios "premium". Algo asi:

IF (user.fecha_baja IS NOT NULL) THEN (Recorriendo "files" IF(user.ID = file.Uploader AND file.premium="YES") THEN (borra archivo) ).
Estás entendiendo mal.
MySQL no puede borrar archivos de un servidor. Lo que haces con esas tablas es consultar cuáles son los que deberías borrar, hacerlo en la aplicación, y luego actualizar la tabla con aquellos que fueron exitosos.
En la tabla lo que haces es registrar lo hecho, no mandar a hacer algo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 04/03/2013, 11:06
 
Fecha de Ingreso: diciembre-2012
Mensajes: 21
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: usuarios free / premium

Vaale. Ya me estaba volviendo loco porque no encontraba la manera... Resulta que no se podia desde la BD. Muchas gracias, de verdad

Etiquetas: free, insert, php, premium, select, sql, tabla, usuarios
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 18:54.