Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Modelowanie BD
Forum PHP.pl > Forum > Bazy danych > MySQL
Shrapnel
Witam wszystkich,

na poczatku chciałbym zaznaczyć, że zaczynam przygodę z MYSQL i właśnie dlatego pojawiło się kilka problemów natury teoretycznej.

Ale, ale od początku - mam za zadnie postawić BD, której jednym z elementów będzie tabela contacts:



Po kilku tutorialach nauczyłem się jak obsługiwać podstawowe zapytania w MYSQL, gdy moje pojmowanie MYSQL zostało wywrócone przez to co odkryłem googlując "modelowanie BD". I wtedy dopiero zrozummiałem, na czym polega potęga SQL. Wcialając pojęcie "redundancji" w życie poprawiałem tą tabelę, która wyjąda teraz tak:



Pytanie 1. Czy jest to właściwie zbudowany model? Czy tak to właśnie powinno wyglądać? Jakieś pomysły, podpowiedzi bardziej doświadczonych użytkowaników?

Pytanie 2. Model stworzyłem w WorkBenchu 6.1 Na papierze wygląda fajnie, tylko jak to teraz obsługiwać? Jak wgrać rekordy do takiej bazy? Wcześniej używałem INSERT INTO (z pliku .csv) i ładował. Co mam zrobić z taką "porozbijaną" tebelą żeby foreign keys działały?Jak się to takiego zagadnienia podchodzi? Format danych jest taki:



i za każdym razem importuję 10K - 100K. Dodam, że nie oczekuję gotowego rozwiązania (choć byłoby miło), ale chociaż naprowadzenia na to jak to zrobić! wink.gif
kartin
  1. W jakim celu wydzieliłeś tabelę classification? Każde z pól we wszystkich tabelach może być puste, nic nie jest wymagane? Tabela alt_phone też wygląda dziwnie. Dlaczego akurat te dwa nr telefonu znalazły się w osobnej tabeli i to jako dwie osobne kolumny?
  2. Pisze się program/skrypt do importu danych.
Pyton_000
Nie ma sensu robienie rozdzielania tabel jeżeli są relacje 1-1. Możesz wydzielić co najwyżej common Cols czyli takie które są pobierane "zawsze" i takie które co jakiś czas są dociągane.


U ciebie rozdzielenie nie ma sensu.
Shrapnel
Dziękuję za cenne uwagi, oczywiście pola name,surname nie mogą być puste. Tabelę `classification` wydzieliłem chcąc usunąć część "niepotrzebnych" danych z `contacts`. Generalnie chodzi o to że z tabeli `contacts` trzeba usunąć kontakty które znajdują się w existing_leads. Te identyfikuję po name, surname, phone,mobile. Pomyślałem, że przerzucenie "niepotrzebnych" danych do innej tabeli przyśpieszy proces wyszukiwania?

Pytanie czy takie rozdzielenie w ogóle ma sens (docelowo po usunięciu rekordów z contacts na podstawie existing_leads będę potrzebował znowu połączyć wszytsko żeby zrobić z tego ładny widok). Co o tym myślicie? czy warto zostać czy pierwszej koncepcji jednej dużej tabeli? Czyli tak:



czy raczej poprawić relacje 1:1 i zrobić tak:





A propos importu danych i skryptu to czy pownien on być w PHP i wyglądać tak jak tu (post Pyton_000 z innego forum):

  1. <?php
  2. function import_cvs($cvs, $separator, $tabela) {
  3.  
  4. $handle = fopen("$cvs", "r");
  5. $i = 1;
  6. while (($data = fgets($handle, 4092)) !== FALSE)
  7. {
  8. if ($data[0][0] == '#' || $data[0][0] == '*' || empyt($data[0])) {
  9. continue;
  10. }
  11.  
  12. $sql = 'INSERT INTO `' . $tabela . '` (';
  13. $data = explode($separator, $data);
  14. if ($i == 1) {
  15. $pola = count($data);
  16.  
  17. for ($j=0; $j<$pola; $j++) {
  18.  
  19. $sql .= '`' . $data[$j] . '`';
  20.  
  21. if ($j < $count - 1) {
  22. $sql .= ', ';
  23. }
  24. }
  25. continue;
  26. }
  27.  
  28. $sql .= ') VALUES (';
  29.  
  30. for ($j=0; $j<$pola; $j++) {
  31.  
  32. $sql .= '`' . $data[$j] . '`';
  33.  
  34. if ($j < $count - 1) {
  35. $sql .= ', ';
  36. }
  37. }
  38.  
  39. $sql .= ');';
  40. or die('<b>Wystapil blad nr:</b> ' . mysql_errno() . '<br /><b>Opis bledu:</b> ' . mysql_error());
  41.  
  42. $i++;
  43. }
  44. fclose($handle);
  45. $message = 'Pomyślnie zaimportowano: ' . $i-1 . ' wierszy.';
  46. return $message;
  47. }
  48.  
  49.  
  50. ?>
Pyton_000
To mój kod? Nie może być wink.gif (czyżby z WH?)

Powiem tak... o ile nie robisz "SELECT *" to dane mogą być w jednej tabeli.

Co do samego projektu to:

Tabela phone połączona relacją 1:n po ID gdzie phone:
Kod
|---------|-------|------|
| user_id | phone | type |
|---------|-------|------|


I zamiast addres i business_address:
Kod
|---------|------|---------|--------|-------|-----|------|
| user_id | name | address | suburb | state | zip | type |
|---------|------|---------|--------|-------|-----|------|

Przy czym name może być NULL, a type określa czy biznesowy czy zwykły
Shrapnel
czyli mniej więcej powino wyglądać to tak:



Niestety zazwyczaj potrzebuję wszystkich informacji z BD więc używam SELECT*... czy w tym wypadku rozsądniej będzie trzymać to w jednej tabeli? tak jak ta pierwsza koncepcja:

Turson
Jak połączysz tabele JOINem to SELECT * można
Shrapnel
Cytat(Turson @ 8.09.2014, 17:16:12 ) *
Jak połączysz tabele JOINem to SELECT * można


To, że można to wiem, chodzi o to czy to ma sens? Zrobić jedną tabelę czy ją poodzielić? Jeśli dzielić a później sklejać to czy optymalizacja jest warta zachodu?
Pyton_000
Sklejanie nie jest czaso i zasobożerne. Ale jeżeli będziesz miał np. >2 typów adresów i >2 telefonów to moja struktura jest bardziej optymalna bo nie duplikujesz kolumn.
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.