MySQL - Estructura correcta de base de datos

   
Vista:

Estructura correcta de base de datos

Publicado por Chebe (4 intervenciones) el 30/07/2013 15:16:54
Hola,

Tengo un problema al diseñar una base de datos para una web que debe almacenar información de hoteles. La duda la tengo al plantear almacenar la información de los servicios de los hoteles

Por un lado planteo la tabla con la información básica del hotel. Para simplificar la plantearé así.

bbdd: 'hoteles'
id_hotel nombre dirección teléfono
1 Melià Madrid 911234567
2 AC Barcelona 937654321
3 Hilton Valencia 934567791

I para almacenar los servicios he pensado en dos opciones

Opción 1: Tener una tabla con los servicios que ofrece cada hotel. Sería algo como la siguiente:

bbdd: 'servicios_hotel'
id_hotel servicio
1 Piscina
1 Bar
1 Recepción 24h
2 Piscina
2 Parking
3 Admiten perros
3 Mini golf

Opción 2: Tener una tabla con los servicios ('servicios') y otra con la relación entre hotel y servicios ('hotel-servicio'). Para poner los serviciós anteriores quedaria:
bbdd: 'servicios'
id_servicio servicio
1 piscina
2 bar
3 recepcion 24h
4 parking
5 admiten perros
6 mini golf

Y

bbdd: 'hotel-servicio'
id_hotel id_servicio
1 1
1 2
1 3
2 1
2 4
3 5
3 6

Mi dudas són: ¿Que opción es la más recomendable?
¿Como debo efectuar las consultas para actualizar y mostrar la información?
En hacer los join no tengo problema, pero estoy acostumbrado a que cada registro me quede en una "fila" i a partir de ahí ir hacer el loop entre los registros obtenidos. Pero en este caso me quedaría el mismo hotel en "filas" distintas con un servicio diferente en cada "fila".

Muchas gracias por vuestra ayuda!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Estructura correcta de base de datos

Publicado por xve (899 intervenciones) el 30/07/2013 16:09:13
Hola Chebe, la manera correcta es la segunda, tener una tabla con los servicios, y una tabla que vincule los servicios con los hoteles.

Cuando quieras mostrar los servicios, no tienes que vincular la consulta con los hoteles, simplemente haz una consulta vinculando la tabla servicios con la tabla hotel-servicio.

No se si me he explicado bien... coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Estructura correcta de base de datos

Publicado por Chebe (4 intervenciones) el 30/07/2013 16:28:33
Ok, Muchas gracias.
Entiendo lo que dices, pero si lo que quiero es mostrar la información de los hoteles de la siguiente forma:

Hotel: Servicios
Meliá: Piscina, Bar, Recepción 24h.
AC: Piscina, Parking.
Hilton: Admiten perros, minigolf.

Entonces si que debo hacer un join de las tres tablas, no?
Y recibiré la información de la siguiente forma:
Hotel Servicios
Melia Piscina
Meliá Bar
Meliá Recepción 24h
AC Piscina
AC Parking
Hilton Admiten perros
Hilton Minigolf

Y entonces para poder representarlo como lo he puesto antes ya sería cuestión de PHP (en mi caso).
Cada vez que el registro fuese un hotel distinto haria salto de línea y pondria dos puntos y el servicio y mientras el nombre del hotel fuese igual al anterior simplemente pondría coma y el servicio.

Pensaba que habría alguna manera de recibir toda la información ya directamente des de MYSql en forma de tabla con un solo registro por hotel, pero imagino que no tiene mucha lógica.

Muchas grácias, veré que tal me apaño.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Estructura correcta de base de datos

Publicado por xve (899 intervenciones) el 30/07/2013 17:19:09
Es exacto como dices Chebe... cuando se repite el hotel, haces el salto de linea...

por lo menos, esta es la manera que yo utilizo siempre... no se si hay alguna otra manera...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Estructura correcta de base de datos

Publicado por leonardo_josue (81 intervenciones) el 31/07/2013 19:43:40
Hola Chebe...

Otra opción es utilizar la función GROUP_CONCAT de MySQL:

http://dev.mysql.com/doc/refman/5.0/es/group-by-functions.html

Lo que hace es generar una cadena con los registros similares (en este caso servicios) separados por comas (,)... es decir, podrías hacer algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
mysql> SELECT * FROM hoteles;
+----------+--------+-----------+-----------+
| id_hotel | nombre | direccion | telefono  |
+----------+--------+-----------+-----------+
|        1 | Melia  | Madrid    | 911234567 |
|        2 | AC     | Barcelona | 937654321 |
|        3 | Hilton | Valencia  | 934567791 |
+----------+--------+-----------+-----------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM servicios;
+-------------+----------------+
| id_servicio | servicio       |
+-------------+----------------+
|           1 | piscina        |
|           2 | bar            |
|           3 | recepcion 24h  |
|           4 | parking        |
|           5 | admiten perros |
|           6 | mini golf      |
+-------------+----------------+
6 rows in set (0.00 sec)
 
mysql> SELECT * FROM hotel_servicio;
+----------+-------------+
| id_hotel | id_servicio |
+----------+-------------+
|        1 | 1           |
|        1 | 2           |
|        1 | 3           |
|        2 | 1           |
|        2 | 4           |
|        3 | 5           |
|        3 | 6           |
+----------+-------------+
7 rows in set (0.00 sec)
 
mysql> SELECT h.nombre, s.servicio
    -> FROM hotel_servicio hs
    -> INNER JOIN hoteles h ON h.id_hotel = hs.id_hotel
    -> INNER JOIN servicios s ON s.id_servicio = hs.id_servicio;
+--------+----------------+
| nombre | servicio       |
+--------+----------------+
| Melia  | piscina        |
| Melia  | bar            |
| Melia  | recepcion 24h  |
| AC     | piscina        |
| AC     | parking        |
| Hilton | admiten perros |
| Hilton | mini golf      |
+--------+----------------+
7 rows in set (0.00 sec)
 
mysql> SELECT h.nombre, GROUP_CONCAT(s.servicio) servicios
    -> FROM hotel_servicio hs
    -> INNER JOIN hoteles h ON h.id_hotel = hs.id_hotel
    -> INNER JOIN servicios s ON s.id_servicio = hs.id_servicio
    -> GROUP BY h.nombre;
+--------+---------------------------+
| nombre | servicios                 |
+--------+---------------------------+
| AC     | piscina,parking           |
| Hilton | admiten perros,mini golf  |
| Melia  | bar,piscina,recepcion 24h |
+--------+---------------------------+
3 rows in set (0.00 sec)


En la primer consulta con JOIN's, presenta los servicios en registros independientes, en la última consulta, hace la agrupación en un solo campo.

Dale un vistazo para ver si te sirve.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Estructura correcta de base de datos

Publicado por Chebe (4 intervenciones) el 01/08/2013 09:22:39
Hola Leo,

Muchíssimas gracias, es perfecto.
Es exactamente lo que estaba buscando.

Saludos

Chebe
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar