2011-11-12 14 views
5

Nie wiem dokładnie, co powinienem nazwać to pytanie. Właśnie rozpocząłem programowanie po stronie serwera i potrzebuję pomocy.Dynamiczne tworzenie nowych modeli rekordów aktywnych i tabel bazy danych

Wszystkie samouczki I do tej pory przeczytać na RoR czynienia z tworzeniem predefiniowanych tabeli iz zdefiniowanym pola (id, nazwisko, e-mail, etc etc). Używają ActiveRecord jako klasy bazowej, a zapisywanie do db jest obsługiwane automatycznie przez nadklasę.

To, co próbuję programować, to coś, co pozwala na zdefiniowanie przez użytkownika tabeli z polami. Pomyśl o tym w ten sposób. Interfejs internetowy będzie zawierał pustą tabelę, użytkownik wskaże nazwę tabeli i doda kolumny (pole), a następnie doda wiersze, a następnie zapisze je. Jak mam to wdrożyć? Nie proszę o szczegóły, tylko o przegląd. Jak już wspomniałem, wszystkie tutoriale, które przeczytałem do tej pory, dotyczą wstępnie zdefiniowanych tabel z polami, w których wstępnie zdefiniowano podklasę ActiveRecord.

Tak więc, w skrócie, pytam, jak tworzyć tabele w db na runtime i dodawać pola do tabel.

Mam nadzieję, że było jasne, jeśli nie, proszę dać mi znać, a ja postaram się opracować nieco więcej. Dzięki.

+3

Jeśli dopiero zaczynasz programowanie WWW po stronie serwera, to może zacząć od Hello world? :) Z twojego pytania wynika, że ​​chcesz zbudować internetową bazę danych z całą masą meta-programowania. Sugeruję podjęcie stopniowych kroków w tym kierunku. Mogę nieco zobrazować, jak można zrobić to, czego chcesz, po prostu nie wyjaśniaj tego w "tylko zaczynasz programować po stronie serwera". Mam na myśli to w najładniejszy sposób. Tak? –

+1

Wynajmowanie przypadkowych użytkowników jako projektanta bazy danych jest ryzykowną i ryzykowną działalnością. –

+1

To, co próbujesz zrobić, jest BARDZO ZAAWANSOWANE i w zasadzie jest to zły pomysł (ale w rzeczywistości całkiem typowy dla początkujących!). Użytkownicy systemu powinni przechowywać dane. Posiadanie ich przy tworzeniu tabel jest po prostu złym podejściem i złym pomysłem, chyba że masz dużą ilość doświadczenia z DBMS. Twórca schematu (w tym przypadku) musi tylko tworzyć elastyczne struktury danych, które będą przechowywać wszystko, czego potrzebujesz. Po prostu zapomnij o tym, że użytkownik tworzy podejście do tabel. W końcu oni też tworzyli indeksy? Czy oni rozumieją wyjątkowy? Czy rozumieją łączenia? klucze kompozytowe? tak. –

Odpowiedz

2

Chyba że budujesz narzędzie administracyjne DB (a może nawet wtedy), pozwalając użytkownikowi na bezpośredni dostęp do warstwy bazy danych w sposób sugerowany przez Ciebie to prawdopodobnie zły pomysł. Oprócz kwestii stabilności i bezpieczeństwa, będzie bardzo wolno, jeśli Twoi użytkownicy tworzą wiele tabel.

Na przykład, jeśli chcesz wyszukać określoną wartość dla 100 tabel użytkowników, musisz uruchomić 100 oddzielnych zapytań. Strona będzie się wykładniczo wolniejsza, im więcej utworzonych tabel użytkowników.

saner sposobem na to może być mieć model stołowy jak ten

class Table < ActiveRecord::Base 
    has_many :fields 
    has_many :rows 
end 

każdym stole miałoby pól dołączonych do niego i wiersze do przechowywania odpowiednich danych (co byłoby zakodowane jakoś).

Jednak, jak słusznie zauważa @Aditya, nie są to rzeczy naprawdę początkujące!

+1

To jest anty-wzór "wewnętrznej platformy". Tworzysz "wewnętrzną" bazę danych przy użyciu istniejącej platformy bazodanowej, która będzie działała słabo i będzie trudniejsza do zrozumienia niż tworzenie i modyfikowanie rzeczywistych tabel. Byłoby mu lepiej dynamicznie zmieniać schemat oddzielnej bazy danych lub schematu z aplikacji, oczywiście z pewnymi środkami bezpieczeństwa. Zgadzam się, oczywiście, że to nie są rzeczy początkujące. – fregas

1

Zgadzam się na ogół z poprzednimi odpowiedziami. Z twojego pytania nie wynika jednoznacznie, dlaczego chcesz utworzyć tabelę w środowisku wykonawczym. Nie jest tak naprawdę oczywiste, jaka byłaby korzyść z tego. Jeśli po prostu próbujesz przechowywać dane, które pasują do tabeli z wierszami i kolumnami, możesz po prostu zapisać ją jako tablicę w polu tabeli użytkownika. Jeśli użytkownik ma prawo do tworzenia wielu tabel, to może masz coś podobnego

class User < ActiveRecord::Base 
    has_many :tables 
    end 

a następnie każda tabela może mieć pole do przechowywania zserializowanego tablicę. Lub możesz pójść z sugestią Alexa - najlepszy wybór naprawdę zależy od tego, co masz zamiar zrobić z danymi, jak często się zmienia, czy potrzebujesz go przeszukać itd.

1

Możesz stworzyć bazę danych jak pokazano w samouczkach, które przechowują nazwy tabel i ich nazwy kolumn, które użytkownik chce.Następnie możesz mieć robotnika (który można zbudować za pomocą Redisa i Resque'a, here jest prosty Tut na Resque i Redis) i kazać pracownikowi uruchomić migrację (zapisać migrację ze zmiennymi i użyć params do ich zastąpienia) dla ciebie dla nowej tabeli w DB jako wkrótce jako nowy wpis w bazie danych. Powiedz mi, jeśli masz pytania na ten temat.

+1

On jest TYLKO STARTOWY. "który można zbudować za pomocą Redis i Resque" jest nutso. –

Powiązane problemy