Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]optymalizacja struktury, Spis godzin otwarcia sklepów
KsaR
post
Post #1





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


  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

Ten post edytował KsaR 13.09.2016, 13:06:59


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
trueblue
post
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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?


--------------------
Go to the top of the page
+Quote Post
KsaR
post
Post #3





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


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)


--------------------
Go to the top of the page
+Quote Post
trueblue
post
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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



--------------------
Go to the top of the page
+Quote Post
KsaR
post
Post #5





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
trueblue
post
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 07:34