2011-11-18 4 views
5

Zostałem poproszony o stworzenie aplikacji, która umożliwia użytkownikom wprowadzanie danych do formularza internetowego, który zostanie zapisany, a następnie ostatecznie użyty do wypełnienia pól formularza PDF.Porady dotyczące schematu bazy danych do przechowywania pól formularzy i wartości pól

Mam problem z próbą wymyślenia dobrego sposobu przechowywania wartości pól w bazie danych, ponieważ formularze będą dynamiczne (na podstawie pól pdf).

W samej aplikacji będę przekazywał dane dookoła tablicy mieszającej (nazwa pola, wartość pola), ale nie wiem, jak najlepiej przekonwertować wartości mieszania na db.

Używam formularzy internetowych MS SQL 2000 i asp.net. Czy ktoś pracował nad czymś podobnym?

+0

Być może możesz udostępnić niektóre pola i relacje z nami. Czasami, i to naprawdę zależy od celu, tabele muszą być znormalizowane, a czasami musimy denormalizować tabele (jak w niektórych przypadkach magazynowania!) :) – Nonym

+0

Wciąż jestem na bardzo wczesnym etapie projektowania, więc nic nie ma zostały sfinalizowane za pomocą dowolnych środków. Najprawdopodobniej, jak zasugerowałam poniżej, zamierzam mieć tabelę Form, która przechowuje kolumny takie jak typ formularza, created_on, etc ... Tabela formularzy będzie miała relację jeden do wielu z polem tabeli FormField przechowującej nazwę, typ i wartość. – pteranodonjohn

+0

Chciałem tylko dodać, że jest to aplikacja typu back office z ubezpieczeniem. Wartości pól przechowują informacje, takie jak numery licencji kierowcy, w polach adresu. – pteranodonjohn

Odpowiedz

4

Czy rozważali Państwo zastosowanie tutaj bazy danych dokumentów? Jest to problem, który rozwiązują znacznie lepiej niż tradycyjne rozwiązania RDBMS. Osobiście jestem wielkim fanem RavenDb. Kolejną całkiem przyzwoitą opcją jest CouchDb. Uniknąłbym MongoDb, ponieważ to naprawdę nie jest bezpieczne miejsce na dane w jego obecnej implementacji.

Nawet jeśli nie można korzystać z bazy danych dokumentów, można udawać, że SQL to taki, konfigurując tabele tak, aby miały pewne metadane w tradycyjnych kolumnach z polem danych, które jest serializowane XML lub json. Dzięki temu możesz wyszukiwać metadane, pozostając poza obszarem EAV. Ziemia EAV to okropne miejsce.

UPDATE

Nie jestem pewien, czy to dobry przewodnik istnieje, ale koncepcja jest dość prosta. Podstawową ideą jest rozbicie części, które chcesz przesłać, na "normalne" kolumny w tabeli - dzięki temu możesz wyszukiwać w standardowy sposób. Po znalezieniu rekordów, które chcesz, możesz pobrać CLOB i deserializować go odpowiednio. W twoim przypadku trzeba stół, który wyglądał mniej więcej tak:

SurveyAnswers 
    Id INT IDENTITY 
    FormId INT 
    SubmittedBy VARCHAR(255) 
    SubmittedAt DATETIME 
    FormData TEXT 

Kilka protips:
a) użyć tekstu na podstawie rutynowych serializacji. Daje ci szansę na naprawę błędów w danych i naprawdę pomaga w debugowaniu.
b) W przypadku SQL 2000, możesz rozważyć zerwanie CLOB (pole TEKST zawierające dane ładunku) w osobnej tabeli. Dawno nie używałem SQL 2000, ale moje wspomnienia polegają na używaniu kolumn TEKSTU do tabel.

+0

Naprawdę kocham ten pomysł. Miałem nadzieję na przechowywanie informacji w json lub xml, ale jestem bardzo ograniczony do przechowywania bazy danych. Zasadniczo utknąłem z ms sql server 2000. Czy mógłbyś wskazać mi gdzie mogę znaleźć dokumentację na temat używania metadanych w kolumnach? – pteranodonjohn

+0

Po prostu rozszerzyłem odpowiedź; Używałem tego bardzo pomyślnie w aplikacjach FWIW opartych na Sql 2000. –

1

Sugeruję mirroring taką samą strukturę:

Form 
----- 
form_id 
User 
created 

FormField 
------- 
formField_id 
form_id 
name 
value 
1

Roztwór do czego opisujące nazywa Entity Attribute Value (EAV) i model ten może być królewski ból do czynienia. Powinieneś więc ograniczyć w maksymalnym stopniu swoje wykorzystanie tego.

Na przykład istnieją pola, które prawie zawsze znajdują się w formularzach (imię, nazwisko, adres e-mail itp.), A następnie należy je umieścić w tabeli jako pola.

Powodem tego jest, ponieważ nie jeśli nie ktoś prędzej czy później będzie sobie sprawę, że mają te nazwiska i e-maile i poprosi, aby zbudować ten zapytanie

 SELECT 
     Fname.value fname, 
     LName.Value lname, 
     email.Value email, 
     .... 
    FROM 
     form f 
     INNER JOIN formFields fname 
     ON f.FormId = ff.FormID 
      and AttributeName = 'fname'  
     INNER JOIN formFields lname 
     ON f.FormId = ff.FormID 
      and AttributeName = 'lname' 
     INNER JOIN formFields email 
     ON f.FormId = ff.FormID 
      and AttributeName = 'email' 
     .... 

kiedy mogłeś to napisane

SELECT 
     common.fname, 
     common.lname, 
     common.email, 
     .... 
    FROM 
     form f 
     INNER JOIN common c 
     on f.FormId = c.FormId 

uzyskać także poza SQL 2000 tak szybko jak to możliwe, ponieważ masz zamiar naprawdę brakuje klauzuli UNPIVOT

Jest także strona nie jest to zły pomysł, aby spojrzeć na poprzednie SO EAV questions, aby dać wyobrażenie o problemach, które ludzie napotkali w przeszłości

+0

Dzięki za dane na pewno będę badać EAV. Chciałabym móc wyjść z SQL 2000, ale moce, które będą trzymać mnie tam przez bardzo długi czas, obawiam się. – pteranodonjohn