Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Modelowanie BD, podstawowe pytania dt. modelowania BD, jej użycia i update
Shrapnel
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 1
Dołączył: 4.08.2014

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


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:

(IMG:http://i60.tinypic.com/29vgp47.png)

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:

(IMG:http://i62.tinypic.com/5my3jl.png)

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:

(IMG:http://i59.tinypic.com/zn54kk.png)

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ć! (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
kartin
post
Post #2





Grupa: Zarejestrowani
Postów: 246
Pomógł: 79
Dołączył: 25.05.2010

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


  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.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #3





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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.
Go to the top of the page
+Quote Post
Shrapnel
post
Post #4





Grupa: Zarejestrowani
Postów: 6
Pomógł: 1
Dołączył: 4.08.2014

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


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:

(IMG:http://i59.tinypic.com/30xfu3b.png)

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

(IMG:http://i60.tinypic.com/34zlylv.png)



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. ?>
Go to the top of the page
+Quote Post
Pyton_000
post
Post #5





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


To mój kod? Nie może być (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
Shrapnel
post
Post #6





Grupa: Zarejestrowani
Postów: 6
Pomógł: 1
Dołączył: 4.08.2014

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


czyli mniej więcej powino wyglądać to tak:

(IMG:http://i.imgur.com/fxpX6n1.png)

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:

(IMG:http://i.imgur.com/EowkgwP.png)
Go to the top of the page
+Quote Post
Turson
post
Post #7





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Jak połączysz tabele JOINem to SELECT * można
Go to the top of the page
+Quote Post
Shrapnel
post
Post #8





Grupa: Zarejestrowani
Postów: 6
Pomógł: 1
Dołączył: 4.08.2014

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


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?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 10:30