Estoy en el proceso de trabajar en un sistema de perfil de usuario para un sitio web y estoy reflexionando sobre cuál sería un enfoque mejor (escalable). He encontrado dos soluciones y estoy buscando insumos o tal vez consejos sobre algo que podría haber perdido.¿Elegir un método para almacenar perfiles de usuario?
Las siguientes instrucciones de creación de tablas no están destinadas a ser ejecutables, sino que están simplemente ahí para dar una idea del diseño de las tablas involucradas.
Mi idea inicial era algo como esto:
CREATE TABLE user(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_email VARCHAR(320),
user_joined DATATIME,
user_last_seen DATATIME,
user_name_first VARCHAR,
user_name_last VARCHAR,
user_name_alias VARCHAR,
user_location_country VARCHAR,
user_location_region VARCHAR,
user_location_city VARCHAR
# ...
);
Obviamente, esto no es muy escalable en absoluto y añadiendo propiedades adicionales i molesto. La única ventaja es que puedo buscar rápidamente usuarios que coincidan con un conjunto específico de propiedades. He hecho un poco de mirar alrededor y este es un enfoque bastante común (por ejemplo, Wordpress).
Mi segundo enfoque (el que actualmente estoy jugando un poco con) es mucho más escalable, pero estoy un poco preocupado por el rendimiento:
CREATE TABLE user(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_email VARCHAR(320)
);
CREATE TABLE user_profile(
user_id INT UNSIGNED NOT NULL,
visibility ENUM('PRIVATE', 'PUBLIC'),
name VARCHAR,
value VARCHAR
);
uso de este enfoque de cada uso tiene un conjunto de valor clave pares asociados con él, lo que hace que agregar propiedades adicionales sea trivial, así como cargar el perfil de los usuarios cuando inician sesión. Sin embargo, pierdo toda la información de tipo que tenía en el primer enfoque (por ejemplo, DATETIME ahora está almacenado como una cadena formateada), por lo que algunas búsquedas se vuelven molestas. Esto me da más control sobre la selección de las propiedades que el usuario quiere que se muestren públicamente.
¿Sería mejor un enfoque híbrido, permitiéndome equilibrar las ventajas y desventajas de ambos métodos? ¿Qué método usa SO? ¿Hay algún otro enfoque al respecto que no haya pensado o pasado por alto?
Extensión: Con un enfoque híbrido ¿sería ventajoso también insertar las propiedades de la tabla de usuario en la tabla de perfil de usuario para controlar su visibilidad a otros usuarios o podría ser vista como una sobrecarga adicional?
Me parece que (y corríjanme si me equivoco) que este enfoque estaría sujeto a lo largo del tiempo a la "infinidad de mesas" con muchas tablas añadidas a la base de datos para agregar diferentes funcionalidades. –
No estoy seguro de que la hinchazón de la mesa sea realmente un problema. Si tiene una aplicación con 1000 puntos de característica pero solo 5 tablas, sería muy escéptico sobre la normalización de las tablas. Martin Fowler analiza el patrón de diseño del módulo de tabla aquí: http://martinfowler.com/eaaCatalog/tableModule.html – DavGarcia