2009-09-24 14 views
79

Przygotowuję tabelę, która może mieć więcej niż 70 kolumn. Zastanawiam się teraz nad podzieleniem, ponieważ niektóre dane w kolumnach nie będą potrzebne za każdym razem, gdy dostęp do tabeli jest możliwy. Z drugiej strony, jeśli to zrobię, pozostanę przy użyciu złączeń.mysql - ile kolumn jest za dużo?

W którym momencie, jeśli w ogóle, jest to za dużo kolumn?

+6

Nie musimy używać SELECT * przez cały czas. Zawsze mamy opcję wyboru tylko kolumn potrzebnych do danej sytuacji. – APC

+3

70 kolumn ?! Ile z nich nie może mieć wartości zerowej? –

+1

Najważniejsze pytanie brzmi: czy normalizujesz swoje stoły? 70 jest nietypową kwotą, chyba że celowo denormalizujesz wydajność (niewiele rzeczy ma 70 unikalnych atrybutów). Jeśli denormalizujesz ze względu na wydajność, to zgadzam się z ChssPly76, że możesz użyć tego, co baza danych pozwoli ci uciec. – Godeke

Odpowiedz

104

Uważa się, że jest zbyt wiele, gdy jest powyżej maximum limit supported by the database.

Fakt, że nie potrzebujesz, aby każda kolumna była zwracana przy każdym zapytaniu, jest całkowicie normalna; dlatego instrukcja SELECT pozwala jawnie nazwać kolumny, których potrzebujesz.

Zgodnie z ogólną zasadą struktura tabeli powinna odzwierciedlać model domeny; jeśli naprawdę masz 70 (100, jakie masz) atrybuty, które należą do tej samej jednostki, nie ma powodu, aby rozdzielać je na wiele tabel.

+4

+1 złamał mi –

+2

jeśli masz tabelę "Osoba", zazwyczaj masz kolumny takie jak "nazwa", "seks", "dataOfBirth" itd., Jeśli zaczniesz dodawać kolumny takie jak "isSoccerPlayer" i "numberOfTeethPulled" tylko dlatego, że max limit kolumn bazy danych nie został jeszcze osiągnięty, nie tylko zwariowałeś i tworzysz złą bazę danych, ale utrudniasz pracę. możesz myśleć, że ci to ułatwia, ale tak naprawdę nie jesteś. walczysz jak działają bazy danych, zajrzyj do normalizacji –

+20

@KM - właśnie dlatego powiedziałem "atrybuty należące do tej samej jednostki na modelu domeny". Duża liczba kolumn w tabeli NIE czyni go denormalizowanym; to, co mówią kolumny, które się liczą. Poza tym, podczas gdy normalizacja jest zdecydowanie dobra, nie jest rozwiązaniem wszystkich problemów życiowych. Pytanie podstępne - czy uważasz, że liczba głosów przy odpowiedzi na pytanie/odpowiedź na SO jest obliczana jako "wybierz liczbę (*) z głosów" za każdym razem lub czy uważasz, że jest ona denormalizowana? Czy to powoduje, że baza danych SO jest zła, a Jeff Atwood szalony? – ChssPly76

21

Istnieje kilka zalet podziału tabeli na kilka mniejszej liczby kolumn, która jest również nazywana Vertical Partitioning. Oto kilka z nich:

  1. Jeśli masz tabel z wielu wierszy, modyfikowania indeksów może trwać bardzo długo, jak MySQL musi odbudować wszystkich indeksów w tabeli. Posiadanie indeksów podzielonych na kilka tabel może uczynić to szybszym.

  2. W zależności od zapytań i typów kolumn, MySQL może zapisywać na dyskach tabele tymczasowe (używane w bardziej złożonych zapytaniach). Jest to złe, ponieważ dysk i/o może być dużym wąskim gardłem. Dzieje się tak, jeśli masz dane binarne (tekst lub blob) w zapytaniu.

  3. Wider table can lead to slower query performance.

Nie przedwcześnie optymalizować, ale w niektórych przypadkach można uzyskać poprawę z węższych tabelach.

+4

Dlaczego MySQL musi odbudować wszystkie indeksy w tabeli, jeśli tylko jeden jest zmodyfikowany? –

+0

Zastanawia mnie to samo. Dlaczego MySQL odbudowuje wszystkie indeksy w tabeli? Czy powyższe stwierdzenie jest prawidłowe? – maj

10

Jest zbyt duża, gdy narusza zasady normalizacji. Trudno uzyskać tyle kolumn, jeśli normalizujesz bazę danych. Zaprojektuj swoją bazę danych, aby modelować problem, a nie wokół jakichkolwiek sztucznych reguł lub pomysłów dotyczących optymalizacji dla konkretnej platformy db.

Zastosuj następujące zasady do szerokiej tabeli i prawdopodobnie będziesz miał o wiele mniej kolumn w pojedynczej tabeli.

  1. Brak powtarzających się elementów lub grup elementów
  2. Brak częściowe Zależności on a złączonymi kluczowych
  3. żadnych zależności na zakaz kluczowych atrybutów

Oto link pomóc wzdłuż.

+14

'Trudno jest uzyskać tyle kolumn, jeśli normalizujesz bazę danych." Nie tak trudne, jak się wydaje. –

+5

Zdecydowanie nie takie trudne. Ludzie nie wydają się naprawdę rozumieć normalne formy wokół tych części. Możesz mieć 10000 kolumn i STILL być znormalizowane (nawet do najwyższej, normalnej formy). – Hejazzman

+1

Uważam, że bardzo trudno w to uwierzyć. Oczywiście są przypadki ekstremalne, ale ogólnie rzecz biorąc wydaje się, że bardzo trudno jest pomyśleć o obiekcie z 1000 odrębnymi atrybutami, których nie można podzielić na podgrupy. – JohnFx