Hola.
A todo esto no te hemos colocado un simple ejemplo que te podria servir de guia en todo lo que hemos expuesto. Lo siguiente es sencillo, pero podria servirte como una guia basica de por donde empezar para completar tus ideas. Supongo que tu peticion es que X usuario genere una pregunta donde solo el Administrador y el usuario que genero la pregunta puedan responder a la dichosa pregunta del libro de visitas.
Supondre que estas trabajando bajo una base de datos MySQL. Y utilizare el modelado antiguo expuesto por CarlosNuel (Es que me encantan
)
Tengo de ejemplo estas 3 tablas:
mysql> SHOW TABLES;
+--------------------+
| Tables_in_primaria |
+--------------------+
| Libro |
| Respuesta |
| Usuarios |
+--------------------+
3 ROWS IN SET (0.00 sec)
La tabla Usuarios validara que usuario genero que pregunta y en base a ello le permitira responder en su propia pregunta o no... (dicha validacion ya te tocara hacerle dentro del codigo PHP)
Los campos de cada una son:
mysql> EXPLAIN Libro;
+----------+------------+------+-----+---------+----------------+
| FIELD | TYPE | NULL | KEY | DEFAULT | Extra |
+----------+------------+------+-----+---------+----------------+
| id_libro | tinyint(4) | NO | PRI | NULL | AUTO_INCREMENT |
| titulo | CHAR(20) | YES | | NULL | |
| pregunta | CHAR(40) | YES | | NULL | |
+----------+------------+------+-----+---------+----------------+
3 ROWS IN SET (0.00 sec)
mysql> EXPLAIN Respuesta;
+------------+------------+------+-----+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | Extra |
+------------+------------+------+-----+---------+-------+
| id_usuario | tinyint(4) | YES | MUL | NULL | |
| id_res | tinyint(4) | YES | | NULL | |
| respuesta | CHAR(100) | YES | | NULL | |
+------------+------------+------+-----+---------+-------+
3 ROWS IN SET (0.00 sec)
mysql> EXPLAIN Usuarios;
+------------+-------------+------+-----+---------+----------------+
| FIELD | TYPE | NULL | KEY | DEFAULT | Extra |
+------------+-------------+------+-----+---------+----------------+
| id_usuario | tinyint(4) | NO | PRI | NULL | AUTO_INCREMENT |
| usuario | CHAR(10) | YES | | NULL | |
| contrasena | VARCHAR(50) | YES | | NULL | |
+------------+-------------+------+-----+---------+----------------+
3 ROWS IN SET (0.00 sec)
PD: Lo anterior son tablas creadas como ejemplo, recuerda no crear campos que accepten valores nulos para no desviarte de la normalizacion
Ahora suponte que la tabla Usuarios tiene ya 3 usuarios con contrasena registrados.
mysql> SELECT * FROM Usuarios;
+------------+---------+----------------------------------+
| id_usuario | usuario | contrasena |
+------------+---------+----------------------------------+
| 1 | coco | 202cb962ac59075b964b07152d234b70 |
| 2 | maria | 202cb962ac59075b964b07152d234b70 |
| 3 | pedro | 202cb962ac59075b964b07152d234b70 |
+------------+---------+----------------------------------+
3 ROWS IN SET (0.00 sec)
Las contrasenas estan encriptadas en md5 por eso se ven de esa manera.
Ahora imagina que los 3 usuarios existentes ya realizaron 1 pregunta en el libro de visitas.
mysql> SELECT * FROM Libro;
+----------+--------------------+---------------------------------+
| id_libro | titulo | pregunta |
+----------+--------------------+---------------------------------+
| 1 | Como es el Sol? | Quisiera saber porque es blanco |
| 2 | Como es la lluvia? | Porque es transparente |
| 3 | Juego Favorito | Cual me recomiendan |
+----------+--------------------+---------------------------------+
3 ROWS IN SET (0.00 sec)
PD: En el caso anterior al campo id_libro ser una clave primaria dicho usuario solo podra tener capacidad de generar 1 sola pregunta ninguna mas eternamente. Ya que el campo id_libro tiene el mismo valor que id_usuario de Usuarios, pero aunque reconozco esta limitacion esto solo es un ejemplo de guia y en la tabla siguiente te podria dar una idea mas clara de como trabajar con doble indices (un primario y secundario) para que dicho usuario pueda regresar a generar un tema nuevo
Ahora se insertan varios datos segun la pregunta solicitada.
mysql> INSERT INTO Respuesta VALUES((SELECT id_usuario FROM Usuarios WHERE usuario = 'coco'), (SELECT id_usuario FROM Usuarios WHERE usuario = 'coco'), 'Es blanco por su iluminacion interna');
Query OK, 1 ROW affected (0.00 sec)
mysql> INSERT INTO Respuesta VALUES((SELECT id_usuario FROM Usuarios WHERE usuario = 'coco'), (SELECT id_usuario FROM Usuarios WHERE usuario = 'coco'), 'Entonces porque cambia a amarillo');
Query OK, 1 ROW affected (0.00 sec)
mysql> INSERT INTO Respuesta VALUES((SELECT id_usuario FROM Usuarios WHERE usuario = 'coco'), (SELECT id_usuario FROM Usuarios WHERE usuario = 'coco'), 'por efecto de alejacion');
Query OK, 1 ROW affected (0.00 sec)
mysql> INSERT INTO Respuesta VALUES((SELECT id_usuario FROM Usuarios WHERE usuario = 'maria'), (SELECT id_usuario FROM Usuarios WHERE usuario = 'maria'), 'por la gravedad');
Query OK, 1 ROW affected (0.00 sec)
mysql> INSERT INTO Respuesta VALUES((SELECT id_usuario FROM Usuarios WHERE usuario = 'maria'), (SELECT id_usuario FROM Usuarios WHERE usuario = 'maria'), 'Por la densidad');
Query OK, 1 ROW affected (0.00 sec)
Quedando en un total asi:
mysql> SELECT * FROM Respuesta; +------------+--------+--------------------------------------+
| id_usuario | id_res | respuesta |
+------------+--------+--------------------------------------+
| 1 | 1 | Es blanco por su iluminacion interna |
| 1 | 1 | Entonces porque cambia a amarillo |
| 1 | 1 | por efecto de alejacion |
| 2 | 2 | por la gravedad |
| 2 | 2 | Por la densidad |
+------------+--------+--------------------------------------+
5 ROWS IN SET (0.00 sec)
mysql> SELECT * FROM Respuesta WHERE id_usuario = ( SELECT id_usuario FROM Usuarios WHERE usuario = 'coco');
+------------+--------+--------------------------------------+
| id_usuario | id_res | respuesta |
+------------+--------+--------------------------------------+
| 1 | 1 | Es blanco por su iluminacion interna |
| 1 | 1 | Entonces porque cambia a amarillo |
| 1 | 1 | por efecto de alejacion |
+------------+--------+--------------------------------------+
3 ROWS IN SET (0.00 sec)
mysql> SELECT * FROM Respuesta WHERE id_usuario = ( SELECT id_usuario FROM Usuarios WHERE usuario = 'maria');
+------------+--------+-----------------+
| id_usuario | id_res | respuesta |
+------------+--------+-----------------+
| 2 | 2 | por la gravedad |
| 2 | 2 | Por la densidad |
+------------+--------+-----------------+
2 ROWS IN SET (0.00 sec)
PD: Por optimizacion los campos 'usuario' de la tabla Usuarios deberian asignarseles un index para aprovechar la rapidez de consultas:
mysql> EXPLAIN SELECT * FROM Respuesta WHERE id_usuario = ( SELECT id_usuario FROM Usuarios WHERE usuario = 'maria');
+----+-------------+-----------+------+---------------+------------+---------+-------+------+-------------+
| id | select_type | TABLE | TYPE | possible_keys | KEY | key_len | REF | ROWS | Extra |
+----+-------------+-----------+------+---------------+------------+---------+-------+------+-------------+
| 1 | PRIMARY | Respuesta | REF | id_usuario | id_usuario | 2 | const | 2 | USING WHERE |
| 2 | SUBQUERY | Usuarios | REF | indice | indice | 11 | | 1 | USING WHERE |
+----+-------------+-----------+------+---------------+------------+---------+-------+------+-------------+
2 ROWS IN SET (0.01 sec)
Lo anterior repito es un mero ejemplo que sirve de guia basica para llevarte a tu objetivo.