2012-12-14 35 views
7

Wszyscy już tam byli- rozważmy następujący przykład - po pierwsze, klient mówi "każdy użytkownik ma tylko jedno zdjęcie profilowe", więc dodajemy do tego pole dla tabeli użytkowników - pół roku później , wymagania zmieniają się, a użytkownik musi mieć n zdjęć profilowych.Tabela z trójwymiarową bazą danych

Teraz wydaje się to możliwe tylko po dodaniu nowej tabeli, takiej jak user_pictures, aby obsłużyć nową liczność 1: n zamiast 1: 1. Często może to być bardzo skomplikowane. Ilekroć napotykam ten problem, zastanawiam się, dlaczego nie używamy wszystkich trzech wymiarów, w których możemy myśleć. Dwuwymiarowy stół jest ograniczony w sposób, który jest nieco niekompletny - co jeśli, odnosząc się do naszego problemu z obrazem profilu ponownie, pole obrazu w tabeli użytkowników miało głębokość, a ta głębokość uczyniła z pola tablicę, która doskonale reprezentowała obie wartości: 1: 1 i 1: n w tym samym czasie.

Pola tabeli stałyby się po prostu tablicami i automatycznie obsługują obie karty - czy to nie byłoby coś? Przynajmniej bym go użył. Czy jest już coś takiego?

+0

Uwzględniono wszystkie możliwe zależności między "rzeczami" w bazie danych (jeden-do-jednego, jeden-do-wielu, wiele-do-wielu). Jaki byłby przypadek użycia dla "trójwymiarowego" stołu - cokolwiek to znaczy? – NullUserException

+0

Przykładowy przypadek użycia to ten powyżej ze zdjęciami profilu: Musisz dodać nową tabelę, ale jest to wyraźnie uciążliwe. Wzajemne relacje między modelami musiałyby zostać zmienione, odpowiednio zaktualizowane zapytania itp. - z dużą ilością bólu i pracy. Myślę, że jesteśmy w stanie zrobić coś więcej. Czy dwuwymiarowe pole, dzięki któremu stół nie będzie trójwymiarowy, nie rozwiąże tego problemu? – weltschmerz

+1

Relacyjne bazy danych są obsługiwane przez bardzo solidne podstawy - [relacyjna algebra] (http://en.wikipedia.org/wiki/Relational_algebra). Zapewnia to, że są one szybkie i poprawne. To jeden z powodów, dla których wciąż istnieją, gdy inne rodzaje baz danych pojawiały się i znikały przez lata. Nie naprawiaj tego, co nie jest zepsute. – NullUserException

Odpowiedz

7

Oracle obsługuje arrays, a także nested tables. Wygląda na to, że pasujesz do twoich wymagań. W dzisiejszych czasach ludzie wolą modelować wszystko jako tabele i relacje, aby zachować prostotę i spójność, a więc nowoczesne RDBMS nie obsługują tego typu rozwiązań i nie wierzę, że kiedykolwiek stał się standardowym SQL.

+0

Świetna odpowiedź, dzięki za linki! – weltschmerz

4

Standardowa wiele-do-wielu podejścia, wielu użytkowników do wielu zdjęć profilowych, łatwo objęte podejścia trzy tabeli:

Tabela: Użytkownicy
Tabela: Zdjęcia
Tabela: User_Pictures

Jeśli jednak przejdziesz do podejścia NoSQL, możesz przechowywać dokument użytkownika (zwykle w formacie JSON), który przechowuje tablicę obrazów profilu dla tego użytkownika w pojedynczej tabeli.

@gordy +1 dla łącza Oracle. Nie byłem pewien, czy istnieją jakiekolwiek tablice typu RDBS.

2

Opisujesz technikę denormalizacji (wiele kolumn dla instancji jednego pola) i zwykle prowadzi ona do łez, chyba że dokładnie zrozumiesz konsekwencje naruszenia podstawowych zasad relacyjnych.

Klasyczna trudność pojawia się, gdy chcesz zapytać w polu ("znajdź użytkownika, który ma to zdjęcie") i odkryjesz, że instrukcja SQL z "AND IN (pic1, pic2, pic3)" nie może być zaindeksowane i twój optymalizator zaczyna planować zemstę.

+0

+1 za wzmiankę o indeksowaniu – weltschmerz

Powiązane problemy