Modelo de Base de datos de un sistema de preguntas y respuestas


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)
);

[/code]

Si les sirve este ejemplo no duden en compartirlo, en dejar sus comentarios o suscribirse al blog o a mi canal de youtube.

Leave a comment