2009-09-28 13 views
6

Tworzę tabelę z 30-50 kolumnami. Istnieje około 200 tysięcy takich wierszy. Czy zaleca się przechowywanie tych danych w oddzielnych tabelach? Czy występują problemy z wydajnością, gdy masz tyle kolumn?mysql za dużo kolumn?

Opowiem ci trochę o stole. W ciągu ostatnich 10 lat muszę przechowywać wszystkie gry sportowe (koszykówka, baseball, piłka nożna, hokej). W przypadku każdego z nich muszę zachować dodatkowe dane. Niektóre z tych danych pozwalają mi na ponowne wykorzystanie pól w sporcie. Na przykład każda drużyna ma drużynę gospodarzy i gości oraz datę wydarzenia.

Jednak w przypadku każdej z tych gier przechowuję również informacje o liczbie pierwszych porażek, liczbie rzutów i trzech punktach. Oczywiście dane te odnoszą się tylko do niektórych wierszy w tabeli. W rezultacie otrzymuję wiele NULL pól w każdym wierszu.

Mogę podać więcej szczegółów, jeśli to konieczne. Z góry dziękuję za wszelkie ogólne porady.

Odpowiedz

7

Aby rozwinąć na odpowiedź RichardOD „s, ty zazwyczaj mają trzy opcje w przypadku podtypów, a wybór zależy od tego, co należy zrobić z danymi, o których mowa.

Pierwsza opcja to ta, której aktualnie używasz: zachowaj wszystkie kolumny powiązane z różnymi typami w jednej tabeli, z flagami i pustymi znakami używanymi do wskazania typu danego rekordu. Jest to najprostszy sposób na zarządzanie podtypem i generalnie działa dobrze, gdy masz tylko kilka typów lub różne typy nie różnią się zbytnio. W twoim przypadku wygląda na to, że typy mogą się nieco różnić.

Drugą opcją jest zachowanie tabeli centralnej zawierającej wszystkie wspólne kolumny między podtypami i relacje jeden-do-jednego z innymi tabelami, które zawierają szczegółowe informacje o typie tych typów.

Trzecią opcją jest, aby w ogóle nie myśleć o różnych typach jako podtypach i po prostu zachować wszystkie typy rekordów w osobnych tabelach. Tak więc nie ma wspólnej tabeli między typami przechowującymi wspólne dane, a każda tabela będzie zawierała kolumny powtarzające się w tabelach.

Teraz każda opcja ma swoje miejsce. Używałbyś pierwszej opcji, gdy nie ma zbyt wielu różnic między różnymi typami. Używałbyś drugiej opcji, jeśli chcesz manipulować wspólnymi polami niezależnie od pól specyficznych dla rodzaju; na przykład, jeśli chcesz wyświetlić wszystkie gry sportowe w dużej siatce z ogólnymi informacjami, a następnie pozwolić użytkownikom kliknąć, aby zobaczyć szczegóły dotyczące konkretnej gry. Trzecia opcja byłaby używana, gdy typy nie są w ogóle bardzo powiązane i po prostu przechowujesz je razem z wygody; różne schematy, nawet jeśli mają kilka pól, nie powinny być łączone.

Pomyśl o tym, co musisz zrobić z danymi i jak pasuje do tych trzech opcji, i sam zdecyduj, który jest najlepszy. Jeśli nie możesz zdecydować, zaktualizuj swoje pytanie ze szczegółami, w jaki sposób zamierzasz korzystać z danych, a ja lub ktoś inny powinien móc Ci pomóc.

6

Myślę, że problem polega na tym, że masz model like this (przechowuj wszystko w jednej tabeli). This approach, a także this approach to dwie z alternatyw, które można wybrać - jestem pewien, że inni mieliby więcej sugestii.

Wszystkie mają swoje wady i zalety. Nie mogę wypowiedzieć się na temat cech wydajnościowych ich w MySql, ale z pewnością inne podejścia zmniejszają użycie wartości null, co może być tylko dobrą rzeczą.

Jeśli naprawdę interesują Cię różnice między 3 podejściami, poleciłabym kupić książkę Martin Fowler's Patterns of Enterprise Application Architecture.

Jeśli chodzi o charakterystykę wydajności, warto spojrzeć na pytania: like this one i also this one.

Możesz przeczytać o vertical partitioning in MySql here.

+0

Ale nie rozpoczynaj partycjonowania, dopóki nie będziesz zadowolony ze swojego stopnia normalizacji. – reinierpost

0

Na pewno spojrzę na normalizing the table. Chociaż nie jestem pewien co do korzyści związanych z wydajnością, najprawdopodobniej byłaby to korzyść związana z pamięcią masową z dużą liczbą wpisów.

Moja pierwsza zmiana byłoby mieć wszystkie dane, które odnosi się tylko 1 lub 2 sportu i mieć je w oddzielnych tabel za pomocą klucza obcego z tabeli głównej

2

Tak, użyj dużo kolumn, jeśli ma to sens. Pod warunkiem, że nie używasz antipattern takich jak "field1, field2, field3" itp., To jest w porządku.

Wiele NULL jest dobre, nie zaszkodzi wiele. Również 200 tys. To taka niewielka liczba wierszy, że prawdopodobnie nie zobaczysz wielu problemów z wydajnością. Nie wiem, ile wkładek zamierzasz zrobić w tej tabeli, ale jeśli jest to < 100 na sekundę, nie widzę problemu.

Będziesz chciał go jakoś indeksować. Liczba indeksów wpłynie na wydajność wkładki, ale wyobrażam sobie, że większość twoich kolumn nie będzie musiała być indeksowana.

Przy tak małym stole nie ma to większego znaczenia - nic z tego. Możesz duplikować swoje dane kilkanaście razy, nie napotykając na problemy z przestrzenią kosmiczną - jesteś w uprzywilejowanej pozycji.

+0

Rozumiem, że jest to stary temat, ale twoja odpowiedź wygląda na to, że wiesz, że jesteś czymś, a ja po prostu zastanawiałem się nad twoim komentarzem na temat wydajności w 200 tys. Wierszy. Przygotowuję bazę danych, która ma ok. 20 kolumn, ale użytkownicy będą rejestrować i aktualizować swoje dane dotyczące aplikacji - potencjalnie może to być dowolna liczba użytkowników z 1 - 1 mld (nigdy nie wiadomo :-)).Biorąc pod uwagę, że jest to niewielka liczba kolumn, czy istnieje punkt, w którym można oczekiwać, że liczba wierszy spowolni wydajność? Prawdopodobnie decydującym czynnikiem będzie szybkość naszego serwera? – TheBestBigAl

+0

Nie można zgadywać o wydajności, ale 200 tys. Wierszy jest naprawdę niewielkich rozmiarów. Z drugiej strony, 1B wymaga pewnego dostrojenia i musisz dokładnie zaplanować swoje zapytania. Zależy to głównie od tego, czy twoje dane pasują do pamięci RAM czy nie. Jeśli dane pasują do pamięci RAM, prawie wszystko jest łatwe, a jeśli nie, wiele rzeczy staje się trudne (to znaczy wolno). – MarkR

2

200 K razy 50 wartości nie jest ogromnym stołem. Nie przejmuj się wydajnością, dopóki nie uzyskasz łatwości użytkowania i kontroli nad własnymi sprzecznościami.

Istnieje wiele powodów, aby rozłożyć tabelę. Dekompozycja stołu oznacza podzielenie go na dwie lub więcej tabel z większością kolumn wchodzących tylko do jednej tabeli i innych kolumn wchodzących w więcej niż jedną tabelę (klucze obce).

Farell wspomniał o mormalizacji. Podstawową korzyścią dla normalizacji jest to, że wyklucza pewne rodzaje anomalii aktualizacji, w tym te, które pozwalają przechowywać sprzeczne fakty w tej samej tabeli. Korzyści z przechowywania są drugorzędne. Korzyści z wydajności, o ile są obecne, mogą być niewielkie. Mimo to normalizacja jest najważniejszą rzeczą, której możesz się nauczyć o projektowaniu tabeli. Jeśli naruszysz zasady normalizacji bez zrozumienia konsekwencji, będziesz latał na ślepo.

Gdybym został wprowadzony do tabeli bazy danych z 40 kolumnami lub więcej i pojawił się jakiś problem w bazie danych (wydajność, korupcja lub cokolwiek innego), sprawdziłbym, czy ta tabela może być dalej znormalizowana, i jakie są koszty/zalety tego.

Istnieje wiele powodów, dla których należy podzielić tabelę. Jak powiedział Reinerpost, nie zaczynaj martwić się partiami, dopóki nie opanujesz normalizacji.