El siguiente modelo de base de datos fue sacado del sistema QAX: sistema de preguntas y respuestas , espero les sirva. El sistema de preguntas y respuestas esta basado en que un usuario hace una pregunta y los demas usuarios le responden, el usuario que realizo la pregunta inicial puede seleccionar como correcta una de las varias respuestas.
Todos los usuarios pueden hacer votaciones a las preguntas y respuestas.
A continuación les explico las tablas y al final les agrego el código SQL completo.
User
La primera es la tabla user, esta sirve para almacenar y luego poder buscar los usuarios.
- id: id o llave primaria
- name: nombre del usuario
- lastname: apellido
- username: nombre de usuario
- email: email
- password: contraseña de acceso
- image: imagen o foto de perfil
- is_active: valor booleano para identificar si esta activo o inactivo
- is_admin: valor booleano para identificar si el usuario es administrador
- created_at: fecha de creación del usuario
Category
La tabla category sirve para guardar las cartegorias que despues se usaran para organizar las preguntas.
- id: id o llave primaria
- name: nombre de la categoria
Question
La tabla question sirve para almacenar las preguntas.
- id: llave principal
- title: titulo de la pregunta
- descripcion: descripción de la pregunta un texto mas largo
- tags: Etiquetas para la pregunta, separados por comas
- user_id: id del usuario que crea la pregunta
- category_id: id de la categoría a la cual se asocia la pregunta
- is_soved: un valor booleano para saber si la respuesta ya fue resuelta, es decir se marco una respuesta como correcta
- created_at: fecha de creacion
Answer
La tabla answer sirve para almacenar las respuestas.
- id: llave principal
- description: texto o descripcion de la respuesta
- user_id: id del usuario que escribe la respuesta
- question_id: id de la respuesta a la cual se asocia la respuesta
- is_correct: valor booleano para saber si esta respuesta es marcada como correcta
- created_at: fecha de creacion
Vote
La tabla vote sirve para almacenar los votos hacia preguntas o respuestas
- id: llave primaria
- kind_id: valor entero, para saber el tipo de voto, 1 para preguntas , 2 para respuestas
- ref_id: corresponde al id de la pregunta o respuesta asociada
- val: valor entero del voto, puede ser positivo o negativo
- user_id: id del usuario que realiza el voto
- created_at fecha de creacion
Consultas utiles
Seleccionar todas las preguntas por el ID de categoria.
[code language=”sql”] select * from question where category_id=X[/code]
x= id de la categoria
Seleccionar todas las respuestas de una pregunta
[code language=”sql”] select * from answer whete question_id=X[/code]
X=id de la pregunta
Seleccionar todas las preguntas de un usuario.
[code language=”sql”] select * from question where user_id=X[/code]
X = id del usuario
Sumar los votos de una pregunta
[code language=”sql”] select sum(val) from vote where kind_id=1 and ref_id=Y[/code]
Y = id de una pregunta
Sumar votos de una respuesta
[code language=”sql”] select sum(val) from vote where kind_id=2 and ref_id=Y[/code]
Y = id de una respuesta
Codigo SQL
A continuacion todo el SQL de las tablas.
[code language=”sql”]create database qax;
use qax;
create table user(
id int not null auto_increment primary key,
name varchar(50) not null,
lastname varchar(50) not null,
username varchar(50),
email varchar(255) not null,
password varchar(60) not null,
image varchar(255) not null,
is_active boolean not null default 1,
is_admin boolean not null default 0,
created_at datetime not null
);
create table category(
id int not null auto_increment primary key,
name varchar(50)
);
create table question(
id int not null auto_increment primary key,
title varchar(255),
description text,
tags varchar(255),
user_id int not null,
category_id int,
is_solved boolean not null default 0,
created_at datetime not null,
foreign key (user_id) references user(id),
foreign key (category_id) references category(id)
);
create table answer(
id int not null auto_increment primary key,
description text,
user_id int not null,
question_id int,
is_correct boolean not null default 0,
created_at datetime not null,
foreign key (user_id) references user(id),
foreign key (question_id) references question(id)
);
create table vote(
id int not null auto_increment primary key,
kind_id int, /** 1.- question, 2.- answer **/
ref_id int,
val int not null default 0,
created_at datetime not null,
user_id int not null,
foreign key (user_id) references user(id)
);
Si les sirve este ejemplo no duden en compartirlo, en dejar sus comentarios o suscribirse al blog o a mi canal de youtube.