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

0

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.

select * from question where category_id=X

x= id de la categoria

Seleccionar todas las respuestas de una pregunta

select * from answer whete question_id=X

X=id de la pregunta

Seleccionar todas las preguntas de un usuario.

select * from question where user_id=X

X = id del usuario

Sumar los votos de una pregunta

select sum(val) from vote where kind_id=1 and ref_id=Y

Y = id de una pregunta

Sumar votos de una respuesta

select sum(val) from vote where kind_id=2 and ref_id=Y

Y = id de una respuesta

Codigo SQL

A continuacion todo el SQL de las tablas.


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.

LEAVE A REPLY

Please enter your comment!
Please enter your name here