Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ocena] Baza mysql (wstępna)
Forum PHP.pl > Forum > Bazy danych > MySQL
thomson89
Proszę o ocenę bazy danych, czy jest wystarczająca jeżeli chodzi o funkcjonalność sklepową i czy nie ma żadnych błędów logicznych. Czy takie założenie bazy danych sklepu jest poprawne?

Proszę o wstępne oceny, bo i tak nie wiecie zbyt dużo...

LINK
askone
Hej

Kilka uwag:
  • po co dwie tabele dla danych klientów?? Moja propozycja:
      1. TABLE klienci (
      2. id int(10) NOT NULL AUTO_INCREMENT,
      3. -- podstawowe dane konta --
      4. login char(25) collate utf8_polish_ci NOT NULL,
      5. haslo char(50) collate utf8_polish_ci NOT NULL,
      6. email char(25) collate utf8_polish_ci NOT NULL,
      7. pytanie char(50) collate utf8_polish_ci NOT NULL,
      8. odpowiedz char(50) collate utf8_polish_ci NOT NULL,
      9. ustawienia int(10) NOT NULL, -- id --
      10. typklientaid int(10) NOT NULL,
      11. -- dane statystyczne --
      12. ostatnie_logowanie char(50) collate utf8_polish_ci NOT NULL,
      13. ostatnie_ip char(50) collate utf8_polish_ci NOT NULL,
      14. ile_kupil int(10) collate utf8_polish_ci NOT NULL,
      15. ile_zamowil int(10) collate utf8_polish_ci NOT NULL,
      16. -- dane o kliencie jako osoba --
      17. imie char(25) collate utf8_polish_ci NOT NULL,
      18. nazwisko char(25) collate utf8_polish_ci NOT NULL,
      19. -- kontakt --
      20. numer_tel char(15) collate utf8_polish_ci NOT NULL,
      21. numer_gg char(15) collate utf8_polish_ci NOT NULL,
      22. skype char(20) collate utf8_polish_ci NOT NULL,
      23. PRIMARY KEY (`id`),
      24. UNIQUE KEY (`login`)
      25. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1;
      26.  
      27. TABLE typklienta
      28. id
      29. typklienta
      30.  
      31. TABLE adresy
      32. id int(10) NOT NULL
      33. klientid int(10) NOT NULL
      34. typadresuid int(10) NOT NULL
      35. krajid int(10) NOT NULL collate utf8_polish_ci,
      36. województwoid char(25) collate utf8_polish_ci NOT NULL,
      37. miasto char(25) collate utf8_polish_ci NOT NULL,
      38. kod_pocztowy char(10) collate utf8_polish_ci NOT NULL,
      39. ulica char(25) collate utf8_polish_ci NOT NULL,
      40. numer_m_d char(10) collate utf8_polish_ci NOT NULL,
      41.  
      42. TABLE typadresu
      43. id
      44. typadresu
      45.  
      46. TABLE kraj
      47. id
      48. kraj
Wydaje mi się, iż takie atomowe wydzielenie danych pozwoli zachować łatwą możliwość rozbudowy systemu. Ponadto łatwiej będzie zbudować interfejs użytkownika w postaci selektów...

Idąc dalej tą drogą można jeszcze wydzielić tabele: typtelefonu(id, typ), telefon(id, typid, nr, klientid), komunikator(id, typid, nr, klientid), typkomunikatora (id, typ).

ps. pisałem pseudo kod, ale wierzę iż będziesz w stanie zrobić z tego pełnoprawny mysql...

Pozdrawiam smile.gif
nospor
forum oceny sluzy innym ocenom. TEmat przenoszę.

a co ty wszędzie walisz char? Czy adres email ma zawsze dlugość 25 znaków? Poczytaj o typie varchar a nastepnie zastanow sie jaka jest roznica miedzy char a varchar.

"ostatnie_logowanie char(50)"
a od kiedy to data ostatniego logowania to tekst? Data to data. typ DATETIME

"ostatnie_ip char(50)"
Widziales kiedys IP skladające sie z 50 znaków?

"ile_kupil int"
Widziales kiedys klienta co kupił kilka miliardów sztuk czegos?
i na dodatek kupi liczbę ujemną? poczytaj o unsigned

"kod_pocztowy char(10)"
Wiesz jak wyglada kod pocztowy?

"na_ktorya_adres_przes char(20) collate utf8_polish_ci NOT NULL, -- wartosc: firmowy, konataktowy --"
poczytaj o typie ENUM

"CREATE TABLE obserwowane_produkty (
id int(10) NOT NULL auto_increment,
produkt int(10) NOT NULL,
klient int(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1;
"
Zainteresuj się typem InnoDB i relacjami w bazie danych

"cena char(10)"
cena to naprawde tekst?


DAlej mi się już nie chce podawać bo wszystko na jedno kopyto.
ocena: 2-
thomson89
Czyli lepiej w niektórych miejscach dawać varchar?

phpion
CHAR służy do przechowywania danych o stałej długości (np. hasło zakodowane MD5), natomiast w VARCHAR pakujesz dane, których długości nie znasz (imię, nazwisko).
thomson89
To klientów tak załatwiłem

  1. CREATE TABLE klient (
  2. id int(10) NOT NULL AUTO_INCREMENT,
  3. idklienci int(10) NOT NULL,
  4. idustawienia int(10) NOT NULL, -- id --
  5. idtypklienta int(10) NOT NULL, -- id --
  6. idadresy char(25) collate utf8_polish_ci NOT NULL, -- id adrsów --
  7. idfirma int(10) NOT NULL, -- 0 gdy nie firma! --
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1;
  10.  
  11. TABLE klienci (
  12. id int(10) NOT NULL AUTO_INCREMENT,
  13. -- podstawowe dane konta --
  14. login char(25) collate utf8_polish_ci NOT NULL,
  15. haslo char(50) collate utf8_polish_ci NOT NULL,
  16. email varchar collate utf8_polish_ci NOT NULL,
  17. pytanie varchar collate utf8_polish_ci NOT NULL,
  18. odpowiedz varchar collate utf8_polish_ci NOT NULL,
  19. -- dane statystyczne --
  20. ostatnie_logowanie char(50) collate utf8_polish_ci NOT NULL,
  21. ostatnie_ip char(50) collate utf8_polish_ci NOT NULL,
  22. ile_kupil int(10) collate utf8_polish_ci NOT NULL,
  23. ile_zamowil int(10) collate utf8_polish_ci NOT NULL,
  24. -- dane o kliencie jako osoba --
  25. imie varchar collate utf8_polish_ci NOT NULL,
  26. nazwisko varchar collate utf8_polish_ci NOT NULL,
  27. -- kontakt --
  28. numer_tel char(12) collate utf8_polish_ci NOT NULL,
  29. numer_gg char(10) collate utf8_polish_ci NOT NULL,
  30. skype varchar collate utf8_polish_ci NOT NULL,
  31. PRIMARY KEY (`id`),
  32. UNIQUE KEY (`login`)
  33. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1;
  34.  
  35. CREATE TABLE typklienta (
  36. id int(10) NOT NULL AUTO_INCREMENT,
  37. typklienta char(10) collate utf8_polish_ci NOT NULL, -- detaliczni, hurtowi --
  38. PRIMARY KEY (`id`)
  39. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1;
  40.  
  41. CREATE TABLE adresy (
  42. id int(10) NOT NULL AUTO_INCREMENT,
  43. typadresu int(10) NOT NULL, -- firma, nie firma --
  44. kraj int(10) NOT NULL, -- id --
  45. województwo varchar collate utf8_polish_ci NOT NULL,
  46. miasto varchar collate utf8_polish_ci NOT NULL,
  47. kod_pocztowy char(5) collate utf8_polish_ci NOT NULL,
  48. ulica varchar collate utf8_polish_ci NOT NULL,
  49. numer_m_d char(10) collate utf8_polish_ci NOT NULL,
  50. PRIMARY KEY (`id`)
  51. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1;
  52.  
  53. CREATE TABLE firma (
  54. id int(10) NOT NULL AUTO_INCREMENT,
  55. nip varchar collate utf8_polish_ci NOT NULL,
  56. regon varchar collate utf8_polish_ci NOT NULL,
  57. PRIMARY KEY (`id`)
  58. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1;
  59.  
  60. CREATE TABLE panstwa (
  61. id int(10) NOT NULL AUTO_INCREMENT,
  62. nazwa varchar collate utf8_polish_ci NOT NULL,
  63. PRIMARY KEY (`id`)
  64. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1;
Mchl
Kod
ostatnie_logowanie char(50) collate utf8_polish_ci NOT NULL,

To chyba DATETIME powinno być raczej

Kod
województwo varchar collate utf8_polish_ci NOT NULL,


Nie chcesz mieć polskich liter w nazwach tabel/pól. Uwierz mi.

Kod
ostatnie_ip char(50) collate utf8_polish_ci NOT NULL,

Poczytaj o funkcjach INET_ATON i INET_NTOA i zmień to pole na INTEGER UNSIGNED

Kod
idadresy char(25) collate utf8_polish_ci NOT NULL, -- id adrsów --

A nie INT przypadkiem?

Kod
nip varchar collate utf8_polish_ci NOT NULL,
regon varchar collate utf8_polish_ci NOT NULL,


Akurat te numery mają stałą ilość znaków, więc CHAR w odpowiednim rozmiarze.

Kod
idfirma int(10) NOT NULL, -- 0 gdy nie firma! --


Może lepiej NULL gdy nie firma?



Ogólnie: VARCHAR wymaga podania maksymalnego rozmiaru pola.
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.