2012-12-19 7 views
6

Buduję aplikację PHP/MySQL i pozwalam użytkownikom tworzyć własne niestandardowe (o ile tylko chcą) dane profilu (np. Mogą dodawać dowolną ilość informacji do ich profilu z dodatkowymi polami tekstowymi, ale jest tam zestaw pól profilu użytkownika "CORE")MySQL, ale nie znam nazw kolumn przed ręką

Na przykład mogą utworzyć nowy tekst w formularzu i nazwać go "moim zwierzakiem" i/lub "mój ulubiony kolor ". Musimy przechowywać te dane w bazie danych i nie możemy oczywiście utworzyć kolumn dla każdego z ich wyborów, ponieważ nie wiemy, jakie są ich dodatkowe informacje przed ręką.

Jednym ze sposobów, uważamy, że możemy przechowywać wszystkie „addidional info” one dostarczyć jest przechowywanie ich dodatkowe informacje jak JSON i przechowywać go w polu tekstowym MySQL (MySQL kocham :))

widziałem Wtyczki do budowania formularzy Wordpress, w których można tworzyć własne pola, więc myślę, że muszą przechowywać dane w MySQL w jakiś sposób, ponieważ rozwiązania NoSQL wykraczają poza zakres tych wtyczek.

Chciałbym trzymać się MySQL, ale czy uważasz, że rozwiązania NoSQL, takie jak MongoDB/Redis, byłyby lepszą poprawką, skoro do tego?

Dzięki

+0

Odpowiedź, jak zawsze, jest zależna. Jeśli masz setki tysięcy użytkowników, musisz wypróbować różne rozwiązania, aby zobaczyć, co się skaluje. Ale w przypadku niewielkiego zestawu opcji dla relatywnie małego zestawu wierszy, JSON lub serializowana wartość PHP w istniejącym relacyjnym db jest dobra. Myślę, że Wordpress używa serializacji wewnętrznie dla niektórych rekordów opcji. – halfer

+0

+1 za ciekawe pytanie i fajną funkcję :-) –

Odpowiedz

1

można utworzyć tabelę par wartości kluczowych gdzie coś nie w rdzeniu będzie zapamiętana. Tabela wyglądałaby następująco: user_id, name_of_user_specified_field, user_specified_value;

Dowolne name_of_user_specified_field, które zaczyna się wyświetlać, a następnie można dodać do tabeli rdzenia. Jest to nazywane wartością atrybutu Entity. Uwaga: niektórzy ludzie uważają to za wzór.

Jeśli to zrobić, należy dodać kontroli, aby ograniczyć liczbę nowych wpisów użytkownik może utworzyć lub może znaleźć kogoś farszu db z dużą ilością pól :)

+0

Dzięki Ray nigdy o tym nie pomyślał, ale może ??? stać się masywnym, jeśli wielu użytkowników ma dużo niestandardowych pól? Co myślisz? –

+1

@BillJobs yep, dlatego musisz narzucić pewien limit, tak jak użytkownik może utworzyć maksymalnie 10 pól niestandardowych. – Ray

+0

Bardzo, bardzo prawdziwe, limit miałby sens w "danych niestandardowych" –

3

Jednym sposobem podejścia do tego jest użycie pojedyncza tabela przy użyciu paradygmatu EAV lub Entity-Attribute-Value. Zobacz Wikipedia article. Byłoby to o wiele bezpieczniejsze pod wieloma względami niż pozwolenie użytkownikom na wybór schematu bazy danych.

+0

Wygląda naprawdę interesująco, a intro wydaje się rozwiązywać mój problem ... czy to pochodzi z MySQL czy z paradygmatu projektu? –

+1

Jest to naturalne dopasowanie do każdej relacyjnej bazy danych. Może, jak sądzę, może być również użyty w arkuszu kalkulacyjnym. – wallyk

0

MySQL może sobie z tym poradzić. Jeśli dodatkowe dane będą zawsze wyciągane razem (tzn. Nigdy nie będziesz potrzebować pobierania tylko pola dla zwierząt domowych bez innych dodatkowych pól), możesz zapisać je w postaci szeregowej w kolumnie tabeli użytkowników. Jeśli jednak potrzebujesz bardziej relacyjnego modelu, możesz przechowywać dodatkowe dane w osobnej tabeli połączonej z identyfikatorem użytkownika. Dodatkowa tabela będzie zawierała kolumnę dla identyfikatora użytkownika, dodatkową nazwę pola, dodatkową wartość pola i cokolwiek innego, co zechcesz. Następnie wystarczy uruchomić zapytanie JOIN podczas pobierania profilu, aby uzyskać wszystkie dodatkowe pola.

+0

Dzięki za odpowiedź G-Nugget, jest serializowana moja jedyna opcja, gdy nie znam nazw kolumn przed ręką? –

+0

@BillJobs Nie, możesz po prostu wstawić nowy wiersz do tabeli dodatkowych informacji z nową nazwą pola i wartością. –

Powiązane problemy