Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]optymalizacja struktury
Forum PHP.pl > Forum > Przedszkole
KsaR
  1. /**
  2.  * sklep
  3.  */
  4. CREATE TABLE IF NOT EXISTS `stores` (
  5. `store_id` TINYINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
  6. `store_name` VARCHAR(255) CHARSET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL
  7. ) ENGINE=MyISAM CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  8.  
  9. INSERT INTO `stores` (`store_name`) VALUES
  10. ('TESCO');
  11.  
  12. /**
  13.  * dni tygodnia w ktorych sklep jest czynny wraz z id godzin.
  14.  */
  15. CREATE TABLE IF NOT EXISTS `store_week` (
  16. `store_id` TINYINT UNSIGNED NOT NULL,
  17. `store_day` TINYINT UNSIGNED,
  18. /**
  19.   * `hours`.`hour_id` ↓
  20.   */
  21. `store_from` TINYINT UNSIGNED,
  22. `store_to` TINYINT UNSIGNED
  23. ) ENGINE=MyISAM
  24. CHARSET=utf8mb4
  25. COLLATE=utf8mb4_general_ci;
  26.  
  27. INSERT INTO `store_week` (`store_id`, `store_day`, `store_from`, `store_to`) VALUES
  28. (1, 1, 1, 0),
  29. (1, 2, 1, 0),
  30. (1, 3, 1, 0),
  31. (1, 4, 1, 0),
  32. (1, 5, 1, 0),
  33. (1, 6, 1, 0),
  34. (1, 7, 2, 0);
  35.  
  36. /**
  37.  * godziny.
  38.  */
  39. CREATE TABLE IF NOT EXISTS `hours` (
  40. `hour_id` TINYINT UNSIGNED NOT NULL,
  41. `hour` SMALLINT UNSIGNED NOT NULL
  42. ) ENGINE=MyISAM CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  43.  
  44. INSERT INTO `hours` (`hour_id`, `hour`) VALUES
  45. (0, 0000),
  46. (1, 0600),
  47. (2, 0700);


Planuję zrobić spis sklepów wraz z godzinami otwarcia od/do.
Czy te tabele są dobrze znormalizowane?

Przy okazji,
Umie ktos to dobrze pobrać? biggrin.gif próbuję już kilka godzin i nadal nie wyszło.
(Z join, union, ...group by, ...)
Konkretniej:

`stores`.`store_name`,
(`store_week`.`store_from`, `store_week`.`store_to` | jako `hours`.`hour` gdzie `hours`.`hour_id`=tamte id)
gdzie `store_week`.`store_day`=WEEKDAY(CURDATE())+1
trueblue
Dobrze.
Choć osobiście chyba bym nie robił tablicy godzin, lecz wprowadzał je bezpośrednio do tablicy store_week. Co prawda masz klucz obcy tinyint, a godzina na smallint, ale nie wiem czy to taki wielki zysk. Zresztą na upartego godziny, przy założeniu otwarcia nawet z interwałem 15 minut, można zmieścić na tinyint.

Z jakim zapytaniem masz problem?
KsaR
Te godziny właśnie będą się sporo powtarzały,
Zwłaszcza takie jak 00:00, 18:00, 17:00, 07:00 itd. (Po przerobieniu oczywiście)

A problem mam z zapytaniem żeby to spowrotem złożyć w całość:

`stores`.`store_name`,
(`store_week`.`store_from`, `store_week`.`store_to` | jako `hours`.`hour` gdzie `hours`.`hour_id`=tamte id)
gdzie `store_week`.`store_day`=WEEKDAY(CURDATE())+1

bold - chce pobrać
(jednak dla 2 i 3 bold ma byc podmienione z tym underline.
Jeśli italic ma to samo id co te 2 boldy).
Oraz z aktualnego dnia (drugi italic)
trueblue
Cytat(KsaR @ 13.09.2016, 14:23:12 ) *
Te godziny właśnie będą się sporo powtarzały,
Zwłaszcza takie jak 00:00, 18:00, 17:00, 07:00 itd. (Po przerobieniu oczywiście)

Zgadza się, ale niewiele zyskujesz, bo przez dodatkową tablicę masz powtarzalność klucza obcego na tinyint, a gdybyś godziny przechowywał bezpośrednio w dniach otwarcia, to byłaby powtarzalność smallint (choć tak jak pisałem, można użyć do tego tinyint - 0-00:00, 1-00:15, 2-00:30, 6-01:30, itd.).
Tym bardziej, miałbyś łatwiejszą edycję dni otwarcia.

Cytat(KsaR @ 13.09.2016, 14:23:12 ) *
A problem mam z zapytaniem żeby to spowrotem złożyć w całość:

`stores`.`store_name`,
(`store_week`.`store_from`, `store_week`.`store_to` | jako `hours`.`hour` gdzie `hours`.`hour_id`=tamte id)
gdzie `store_week`.`store_day`=WEEKDAY(CURDATE())+1

bold - chce pobrać
(jednak dla 2 i 3 bold ma byc podmienione z tym underline.
Jeśli italic ma to samo id co te 2 boldy).
Oraz z aktualnego dnia (drugi italic)


Coś takiego?
  1. SELECT s.store_name,h1.hour,h2.hour
  2. FROM stores AS s
  3. LEFT JOIN store_week AS sw ON sw.store_id=s.store_id
  4. LEFT JOIN hours AS h1 ON sw.store_from=h1.hour_id
  5. LEFT JOIN hours AS h2 ON sw.store_to=h2.hour_id
  6. WHERE sw.store_day= WEEKDAY(CURDATE())+1

KsaR
Cytat(trueblue @ 13.09.2016, 14:42:50 ) *
[...]gdybyś godziny przechowywał bezpośrednio w dniach otwarcia, to byłaby powtarzalność smallint (choć tak jak pisałem, można użyć do tego tinyint - 0-00:00, 1-00:15, 2-00:30, 6-01:30, itd.).
Tym bardziej, miałbyś łatwiejszą edycję dni otwarcia.

Tego nie rozumiem do końca.
Czyli że godziny z hours dać bezpośrednio w store_week?
A tego z tinyint to już wgl nie rozumiem tongue.gif jak by to wyglądało np. Dla godziny 2101?

Cytat
Coś takiego?

Dokładnie tak, dzięki biggrin.gif
trueblue
Tak. Nie będzie co prawda, to 3NF, ale nie ma sensu.

Dla 21:01 nie da się. Zakładając, że tinyint unsigned ma 256 wartości, to możesz przechowywać z dokładnością do 6 minut (256/24=10.66, 60 minut/10=6 minut).
Jeśli założysz interwał 10 minut, to mnożysz po prostu wartość przez 10. Np.: 128 to 128*10 minut=1280 minut = 21:20.
Zrób to na smallint lub time:)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.