2011-11-18 16 views
5

मैं एक आवेदन उपयोगकर्ताओं कि सहेज लिया जाएगा और उसके बाद अंत में पीडीएफ प्रपत्र खानों को भरने के लिए प्रयोग किया जाता एक वेब प्रपत्र में डेटा दर्ज करने की अनुमति देता है कि बनाने का काम सौंपा गया है महत्व देता है। (पीडीएफ क्षेत्रों के आधार पर)डाटाबेस स्कीमा सलाह

मैं मुसीबत एक अच्छा तरीका है एक डेटाबेस में फ़ील्ड मान स्टोर करने के लिए के रूप में रूपों गतिशील हो जाएगा के बारे में सोच की कोशिश कर रही है।

एप्लिकेशन को स्वयं मैं एक हैश तालिका (FIELDNAME, fieldvalue) में चारों ओर डेटा पास करना, लेकिन मैं सबसे अच्छा तरीका है db मूल्यों के हैश कन्वर्ट करने के लिए पता नहीं है में

मैं एमएस एसक्यूएल सर्वर 2000 और asp.net webforms उपयोग कर रहा हूँ। क्या किसी ने कुछ इसी तरह काम किया है?

+0

शायद आप हमारे साथ कुछ फ़ील्ड और रिश्तों को साझा कर सकते हैं। कभी-कभी, और यह वास्तव में इस उद्देश्य पर निर्भर करता है, टेबल को सामान्यीकृत किया जाना चाहिए, और कभी-कभी, हमें तालिकाओं को denormalize करना होगा (जैसे गोदाम के कुछ मामलों में!) :) – Nonym

+0

मैं अभी भी डिजाइन के शुरुआती चरणों में हूं इसलिए कुछ भी नहीं है किसी भी माध्यम से अंतिम रूप दिया गया है। सबसे अधिक संभावना है, जैसा कि नीचे दिया गया गवाही है, मेरे पास एक फॉर्म टेबल होने जा रहा है जो फॉर्म प्रकार, create_on, आदि जैसे कॉलम संग्रहीत करता है ... फ़ॉर्म तालिका में फॉर्मफ़ील्ड टेबल फ़ील्ड नाम, प्रकार के प्रकार के साथ कई रिश्तों में से एक होगा , और मूल्य। – pteranodonjohn

+0

बस यह जोड़ना चाहता था कि यह एक बीमा बैक ऑफिस प्रकार ऐप है। फ़ील्ड मान फ़ील्ड को संबोधित करने के लिए ड्राइवर लाइसेंस नंबर जैसी जानकारी रखेंगे। – pteranodonjohn

उत्तर

4

में समस्या का समाधान दिया है, क्या आपने यहां दस्तावेज़ डेटाबेस का उपयोग करने पर विचार किया है? पारंपरिक आरडीबीएमएस समाधानों की तुलना में यह बहुत ही समस्या है जो वे हल करते हैं। व्यक्तिगत रूप से, मैं RavenDb का बड़ा प्रशंसक हूं। एक और सुंदर सभ्य विकल्प CouchDb है। मैं MongoDb से बचूंगा क्योंकि यह वास्तव में इसके वर्तमान कार्यान्वयन में डेटा के लिए एक सुरक्षित जगह नहीं है।

भले ही आप दस्तावेज़ डेटाबेस का उपयोग नहीं कर सकते हैं, तो आप एक्सएमएल या जेसन को क्रमबद्ध पेलोड फ़ील्ड के साथ पारंपरिक कॉलम में कुछ मेटाडेटा रखने के लिए अपनी टेबल सेट करके SQL होने का दावा कर सकते हैं। यह आपको ईएवी-भूमि से बाहर रहने के दौरान मेटाडेटा पर खोज करने देगा। ईएवी-भूमि एक भयानक जगह है।

अद्यतन

मैं एक अच्छा गाइड मौजूद है, लेकिन अवधारणा बहुत सरल है अगर यकीन नहीं है। मूलभूत विचार उन हिस्सों को तोड़ना है जिन्हें आप तालिका में "सामान्य" कॉलम में पूछना चाहते हैं - इससे आपको मानक शिष्टाचार में क्वेरी करने की सुविधा मिलती है। जब आपको रिकॉर्ड (ओं) मिलते हैं, तो आप सीएलओबी को पकड़ सकते हैं और उचित के रूप में इसे deserialize कर सकते हैं।

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

कुछ protips:
क) एक पाठ आधारित क्रमबद्धता दिनचर्या का उपयोग अपने मामले में आप एक मेज ऐसा ही कुछ देखा होगा। आपको डेटा त्रुटियों को ठीक करने का एक लड़ने का मौका देता है और वास्तव में डीबगिंग में मदद करता है।
बी) एसक्यूएल 2000 के लिए, आप सीएलओबी (अपने पेलोड डेटा को रखने वाले टेक्स्ट फ़ील्ड) को एक अलग तालिका में तोड़ने पर विचार करना चाहेंगे। यह लंबे समय से रहा है क्योंकि मैंने SQL 2000 का उपयोग किया था, लेकिन मेरी यादें टेक्स्ट कॉलम का उपयोग कर टेबल पर बुरी चीजें करती हैं।

+0

मुझे वास्तव में इस विचार से प्यार है। मैं जेसन या एक्सएमएल में जानकारी स्टोर करने की उम्मीद कर रहा था लेकिन मैं डेटाबेस स्टोरेज पर बहुत सीमित हूं। मूल रूप से एमएस एसक्यूएल सर्वर 2000 के साथ फंस गया। क्या आप मुझे कुछ दिशा प्रदान कर सकते हैं कि कॉलम में मेटाडेटा का उपयोग करने पर मुझे दस्तावेज़ कहां मिल सकता है? – pteranodonjohn

+0

बस थोड़ा सा जवाब विस्तारित किया; मैंने एसक्यूएल 2000 आधारित ऐप्स एफडब्ल्यूआईडब्ल्यू पर इसे बहुत सफलतापूर्वक उपयोग किया है। –

1

मैं एक ही संरचना मिरर सुझाव देंगे:

Form 
----- 
form_id 
User 
created 

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

क्या आप का वर्णन कर रहे हैं Entity Attribute Value (EAV) कहा जाता है और इस मॉडल से निपटने के लिए एक शाही दर्द हो सकता है के लिए समाधान। इसलिए आपको जितना संभव हो उतना सीमित करना चाहिए।

उदाहरण के लिए वहाँ क्षेत्रों कि रूपों में लगभग हमेशा से रहे हैं (प्रथम नाम, अंतिम नाम, ईमेल आदि) कर रहे हैं तो आप फ़ील्ड के रूप में एक तालिका में डाल देना चाहिए।

इस का कारण यह है क्योंकि अगर आप ऐसा नहीं कर किसी को अभी या बाद में एहसास वे इन नामों और ईमेल है और इस क्वेरी

 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' 
     .... 

निर्माण करने के लिए आप से पूछना है जब आप इस लिख सकता करने जा रहा है

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

इसके अलावा एसक्यूएल 2000 के उतरना के रूप में जल्दी हो सके, क्योंकि तुम सच में UNPIVOT खंड याद

इसकी भी पी जा रहे हैं पिछले SO EAV questions पर पिछले SO EAV questions को देखने के लिए रोचक रूप से बुरा विचार नहीं है कि लोगों ने पिछले

+0

इनपुट के लिए धन्यवाद मैं निश्चित रूप से ईएवी का शोध करूंगा। काश मैं एसक्यूएल 2000 से बाहर निकल सकता हूं लेकिन शक्तियां जो मुझे बहुत लंबे समय तक वहां रखेगी मुझे डर है। – pteranodonjohn

संबंधित मुद्दे