أكثر

كيف يتم تحديث الحقول غير الفارغة فقط بقيمة إدخال المستخدم في النموذج؟

كيف يتم تحديث الحقول غير الفارغة فقط بقيمة إدخال المستخدم في النموذج؟


لدي نموذج يتكرر من خلال GDB ، يملأ نفس حقل السمة في كل فئة من فئات المعالم بقيمة معلمة. بهذه الطريقة يمكنني وضع علامة على كل FC في قاعدة البيانات الجغرافية فيما يتعلق بالمشروع الذي هم جزء منه.

ومع ذلك ، في بعض الأحيان يحتوي GDB على FC's التي تم ترحيلها من مشاريع GDB الأخرى ، مع ملء السمة بالفعل بقيمة تحددها كجزء من مشروع آخر. حاليًا ، يدوس نموذجي على هذه القيمة ويستبدلها برمز المشروع الجديد ، بينما أريد الاحتفاظ بالمعلومات الموجودة.

أرغب في أن يقوم النموذج بتقييم الحقل للسجل الذي يعمل به ، وإذا لم يكن الحقل فارغًا ، اترك الحقل وشأنه والانتقال إلى السجل التالي. ومع ذلك ، إذا كان الحقل كذلك ، فيجب أن يكتب رمز المشروع الجديد إلى الحقل والمضي قدمًا.

لقد بحثت قليلاً في أسئلة وأجوبة if / then ولكن لم أجد طريقة بسيطة لاكتشاف ما إذا كان الحقل فارغًا أم لا ، وإذا لم يكن كذلك ، فكيف يمكنك تخطيه؟


أحاول الآن كتابة بعض لغة Python للتعامل معها ولدي ما يلي ، ولكني لست متأكدًا من كيفية الحصول على قيمة المعلمة من إدخال المستخدم في النموذج (على سبيل المثال. UserInputFromModelParameter) ، أو ما هو الأمر الذي يجب إرساله لجعل البرنامج النصي يتخطى إلى السجل التالي إذا كان البرنامج النصي صحيحًا.

# إعداد المتغيرات def BlockName: def IgnoreField: # تعيين اسم الكتلة من المستخدم inpuit BlockName = [UserInputFromModelParameter] # تعيين القيم لمشاهدتها لـ IgnoreField = [NULL ، ""] # تقييم الحقل إذا [BlockID] == IgnoreField MoveToNextRecord () ؛ آخر: [BlockID] = BlockName () ؛

لقد كتبت بعض رموز VB لمحاولة التعامل مع هذا باستخدام if / then ، بدا أكثر بساطة من Python.

هذا هو الرمز ،٪ BlockID (بعلامات اقتباس)٪ هي قيمة إدخال المستخدم ، [BlockID] هو الحقل الذي يتم تقييمه / كتابته ، والتعبير = "الإخراج".

If IsNull ([BlockID]) ثم الإخراج =٪ Block (في علامات اقتباس)٪ Elseif [BlockID] <= "" ثم الإخراج =٪ Block (في علامات الاقتباس)٪ Else Output = [BlockID] End If

... يبدو أنه يعمل ، على الرغم من أنه يخرج عن طريق الخطأ إذا أصاب FC بدون حقل "BlockID".


استخدم سلسلة فارغة أو خالية أو أزل الخاصية الفارغة في طلب / استجابة API

عند نقل كائن من خلال واجهة برمجة تطبيقات ، كما هو الحال في تنسيق JSON المخطط ، ما هي الطريقة المثلى لإرجاع خاصية سلسلة غير موجودة؟ أعلم أن هناك طرقًا مختلفة للقيام بذلك كما في الأمثلة الموجودة في الروابط المدرجة أدناه.

أنا متأكد من أنني استخدمت null في الماضي ولكن ليس لدي سبب وجيه للقيام بذلك. يبدو واضحًا استخدام القيمة null عند التعامل مع قاعدة البيانات. لكن قاعدة البيانات تبدو وكأنها تفاصيل تنفيذ لا ينبغي أن تهم الطرف الموجود على الجانب الآخر من واجهة برمجة التطبيقات. على سبيل المثال ربما يستخدمون مخزن بيانات مخططًا يخزن فقط الخصائص ذات القيم (غير خالية).

من وجهة نظر الكود ، فإن تقييد وظائف السلسلة للعمل مع نوع واحد فقط ، أي السلسلة (ليست فارغة) ، يجعلهم أسهل في إثبات تجنب العدم هو أيضًا سبب لوجود كائن الخيار. لذلك ، إذا كان الكود الذي ينتج عنه الطلب / الاستجابة لا يستخدم فارغًا ، فإن تخميني هو أن الكود الموجود على الجانب الآخر من واجهة برمجة التطبيقات لن يتم إجباره على استخدام null أيضًا.

أفضل فكرة استخدام سلسلة فارغة كطريقة سهلة لتجنب استخدام القيمة الفارغة. إحدى الحجج التي سمعتها لاستخدام القيمة null وضد السلسلة الفارغة هي أن السلسلة الفارغة تعني أن الخاصية موجودة. على الرغم من أنني أفهم الاختلاف ، إلا أنني أتساءل أيضًا عما إذا كانت هذه هي تفاصيل التنفيذ فقط وما إذا كان استخدام سلسلة فارغة أو فارغة يحدث أي فرق في الحياة الحقيقية. أتساءل أيضًا عما إذا كانت السلسلة الفارغة مماثلة لمصفوفة فارغة.

إذن ، ما هي أفضل طريقة للقيام بذلك والتي تعالج تلك المخاوف؟ هل يعتمد على تنسيق الكائن الذي يتم نقله (مخطط / مخطط)؟


محتويات

تمثيل البيانات هذا مشابه للطرق الموفرة للمساحة لتخزين مصفوفة متفرقة ، حيث يتم تخزين القيم غير الفارغة فقط. في نموذج بيانات EAV ، يمثل كل زوج من قيم السمة حقيقة تصف كيانًا ، ويخزن صف في جدول EAV حقيقة واحدة. غالبًا ما توصف جداول EAV بأنها "طويلة ونحيفة": تشير كلمة "طويلة" إلى عدد الصفوف ، "النحيفة" بالنسبة للأعمدة القليلة.

يتم تسجيل البيانات على شكل ثلاثة أعمدة:

  • ال كيان: العنصر الموصوف.
  • ال ينسب أو معامل: يتم تنفيذه عادةً كمفتاح خارجي في جدول تعريفات السمات. قد يحتوي جدول تعريفات السمات على الأعمدة التالية: معرف السمة ، واسم السمة ، والوصف ، ونوع البيانات ، والأعمدة التي تساعد في التحقق من صحة الإدخال ، على سبيل المثال ، الحد الأقصى لطول السلسلة والتعبير العادي ، ومجموعة القيم المسموح بها ، وما إلى ذلك.
  • ال القيمة من السمة.

مثال تحرير

ضع في اعتبارك كيف يمكن للمرء محاولة تمثيل سجل سريري للأغراض العامة في قاعدة بيانات علائقية. من الواضح أن إنشاء جدول (أو مجموعة من الجداول) باستخدام آلاف الأعمدة غير ممكن ، لأن الغالبية العظمى من الأعمدة ستكون خالية. لتعقيد الأمور ، في السجل الطبي الطولي الذي يتبع المريض بمرور الوقت ، قد تكون هناك قيم متعددة لنفس المعلمة: طول ووزن الطفل ، على سبيل المثال ، يتغير مع نمو الطفل. أخيرًا ، يستمر عالم النتائج السريرية في النمو: على سبيل المثال ، تظهر الأمراض ويتم ابتكار اختبارات معملية جديدة ، وهذا يتطلب إضافة مستمرة للأعمدة ، ومراجعة مستمرة لواجهة المستخدم. (يُطلق على الحالة التي تتغير فيها قائمة السمات بشكل متكرر "تقلب السمة" في لغة قاعدة البيانات.)

يُظهر ما يلي لقطة لجدول EAV للنتائج السريرية من زيارة إلى الطبيب بسبب الحمى في صباح 1/5/98. الإدخالات المعروضة بين قوسين هي مراجع لمدخلات في جداول أخرى ، تظهر هنا كنص وليس كقيم مفاتيح خارجية مشفرة لسهولة الفهم. في هذا المثال ، فإن ملف القيم كلها قيم حرفية ، ولكن يمكن أيضًا أن تكون قوائم قيم محددة مسبقًا. هذه الأخيرة مفيدة بشكل خاص عندما تكون القيم المحتملة معروفة بأنها محدودة (أي قابلة للعد).

  • ال كيان. للنتائج السريرية ، الكيان هو حدث المريض: مفتاح خارجي في جدول يحتوي على الأقل على هوية المريض وطابع زمني واحد أو أكثر (على سبيل المثال ، بداية ونهاية تاريخ / وقت الفحص) الذي يسجل وقت وقوع الحدث الموصوف.
  • ال ينسب أو معامل: مفتاح خارجي في جدول تعاريف السمات (في هذا المثال ، تعريفات النتائج السريرية). على الأقل ، قد يحتوي جدول تعريفات السمات على الأعمدة التالية: معرف السمة ، واسم السمة ، والوصف ، ونوع البيانات ، ووحدات القياس ، والأعمدة التي تساعد في التحقق من صحة الإدخال ، على سبيل المثال ، الحد الأقصى لطول السلسلة والتعبير العادي ، والحد الأقصى والحد الأدنى المسموح بهما القيم ، مجموعة القيم المسموح بها ، إلخ.
  • ال القيمة من السمة. يعتمد هذا على نوع البيانات ، ونناقش كيفية تخزين القيم قريبًا.

يوضح المثال أدناه نتائج الأعراض التي يمكن رؤيتها في مريض مصاب بالتهاب رئوي.

بيانات EAV الموضحة أعلاه قابلة للمقارنة بمحتويات إيصال مبيعات السوبر ماركت (والتي ستنعكس في جدول بنود المبيعات في قاعدة بيانات). يسرد الإيصال فقط تفاصيل العناصر التي تم شراؤها بالفعل ، بدلاً من سرد كل منتج في المتجر ربما اشتراه العميل ولكنه لم يفعل. مثل النتائج السريرية لمريض معين ، فإن إيصال المبيعات ضئيل.

  • "الكيان" هو معرف البيع / المعاملة - مفتاح خارجي في جدول معاملات المبيعات. يتم استخدام هذا لوضع علامة على كل عنصر سطر داخليًا ، على الرغم من ظهور المعلومات حول البيع في الأعلى (موقع المتجر ، تاريخ / وقت البيع) وفي الأسفل (إجمالي قيمة البيع) عند الإيصال.
  • "السمة" هي مفتاح خارجي في جدول المنتجات ، حيث يبحث المرء عن الوصف وسعر الوحدة والخصومات والعروض الترويجية ، وما إلى ذلك (المنتجات متقلبة تمامًا مثل النتائج السريرية ، وربما أكثر من ذلك: يتم تقديم منتجات جديدة كل شهر ، بينما يتم إخراج البعض الآخر من السوق إذا كان قبول المستهلك ضعيفًا. لا يوجد مصمم قاعدة بيانات مختص يمكنه ترميز المنتجات الفردية مثل Doritos أو Diet Coke كأعمدة في جدول.)
  • "القيم" هي الكمية المشتراة وإجمالي سعر البند.

نمذجة الصف, [ التوضيح المطلوب ] حيث يتم تسجيل الحقائق المتعلقة بشيء ما (في هذه الحالة ، معاملة مبيعات) على أنها متعددة صفوف بدلا من عدة الأعمدة، هي تقنية نمذجة البيانات القياسية. الاختلافات بين نمذجة الصف و EAV (والتي يمكن اعتبارها أ تعميم من نمذجة الصف) هي:

  • الجدول على غرار الصف هو متجانس في الحقائق الموضحة: يصف جدول البنود المنتجات المباعة فقط. على النقيض من ذلك ، يحتوي جدول EAV على أي نوع من الحقائق تقريبًا.
  • يتم تحديد نوع بيانات عمود / أعمدة القيمة في جدول بنموذج الصف مسبقًا حسب طبيعة الحقائق التي يسجلها. على النقيض من ذلك ، في جدول EAV ، يعتمد نوع البيانات المفاهيمية لقيمة في صف معين على السمة في هذا الصف. ويترتب على ذلك أنه في أنظمة الإنتاج ، فإن السماح بإدخال البيانات مباشرة في جدول EAV سيكون وصفة للكوارث ، لأن محرك قاعدة البيانات نفسه لن يكون قادرًا على إجراء تحقق قوي من صحة المدخلات. سنرى لاحقًا كيف يمكن بناء أطر عامة تؤدي معظم مهام التحقق من صحة المدخلات ، دون ترميز لا نهاية له على أساس كل سمة على حدة.

في مستودع البيانات السريرية ، تجد نمذجة الصف أيضًا العديد من الاستخدامات ، وعادةً ما يتم تصميم المخطط الفرعي للاختبار المعملي بهذه الطريقة ، لأن نتائج الاختبارات المعملية عادةً ما تكون رقمية ، أو يمكن ترميزها رقميًا.

يتم سرد الظروف التي قد تحتاج فيها إلى تجاوز نمذجة الصفوف القياسية إلى EAV أدناه:

  • يختلف نوع بيانات السمات الفردية (كما يتضح من النتائج السريرية).
  • فئات البيانات عديدة ومتنامية أو متقلبة ، لكن عدد المثيلات (السجلات / الصفوف) داخل كل فئة صغير جدًا. هنا ، مع النمذجة التقليدية ، قد يحتوي الرسم التخطيطي لقاعدة البيانات بين الكيانات على مئات الجداول: يتم التأكيد على الجداول التي تحتوي على آلاف / ملايين الصفوف / المثيلات بصريًا بنفس القدر مثل تلك التي تحتوي على عدد قليل جدًا من الصفوف. هؤلاء الأخيرون مرشحون للتحويل إلى تمثيل EAV.

ينشأ هذا الموقف في بيئات نمذجة الأنطولوجيا ، حيث يجب غالبًا إنشاء الفئات ("الفئات") أثناء التنقل ، وغالبًا ما يتم التخلص من بعض الفئات في الدورات اللاحقة من النماذج الأولية.

تحتوي فئات معينة ("مختلطة") على بعض السمات غير المتفرقة (موجودة في جميع الحالات أو معظمها) ، في حين أن السمات الأخرى متغيرة للغاية ومتفرقة. هذا الأخير مناسب لنمذجة EAV. على سبيل المثال ، تعتمد أوصاف المنتجات التي تصنعها شركة تكتل على فئة المنتج ، على سبيل المثال ، تختلف السمات الضرورية لوصف علامة تجارية للمصباح الكهربائي تمامًا عن تلك المطلوبة لوصف جهاز التصوير الطبي ، ولكن كلاهما له سمات مشتركة مثل التغليف تكلفة الوحدة وكل عنصر.

وصف المفاهيم تحرير

الكيان تحرير

في البيانات السريرية ، يكون الكيان عادةً حدثًا سريريًا ، كما هو موضح أعلاه. في إعدادات الأغراض العامة ، يكون الكيان عبارة عن مفتاح خارجي في جدول "كائنات" يسجل معلومات شائعة حول كل "كائن" (شيء) في قاعدة البيانات - كحد أدنى ، الاسم المفضل والوصف المختصر ، بالإضافة إلى فئة / فئة الكيان الذي ينتمي إليه. يتم تعيين معرف كائن تم إنشاؤه آليًا لكل سجل (كائن) في هذا الجدول.

كان توم سليزاك وزملاؤه في مختبرات لورانس ليفرمور لقاعدة بيانات كروموسوم 19 رائدًا في أسلوب "جدول الكائنات" ، وهو الآن معيار في معظم قواعد بيانات المعلوماتية الحيوية الكبيرة. لا يتطلب استخدام جدول الكائنات الاستخدام المتزامن لتصميم EAV: يمكن استخدام الجداول التقليدية لتخزين التفاصيل الخاصة بالفئة لكل عنصر.

تتمثل الفائدة الرئيسية لجدول الكائنات المركزي في أنه من خلال وجود جدول داعم لمرادفات الكائنات والكلمات الرئيسية ، يمكن للمرء توفير آلية بحث قياسية تشبه Google عبر النظام بأكمله حيث يمكن للمستخدم العثور على معلومات حول أي كائن مهم دون الحاجة إلى ذلك حدد أولاً الفئة التي تنتمي إليها. (هذا مهم في أنظمة العلوم الحيوية حيث يمكن أن تشير كلمة رئيسية مثل "أستيل كولين" إلى الجزيء نفسه ، وهو ناقل عصبي ، أو المستقبل البيولوجي الذي يرتبط به.

تحرير السمة

في جدول EAV نفسه ، هذا مجرد معرف سمة ، مفتاح خارجي في جدول تعريفات السمات ، كما هو مذكور أعلاه. ومع ذلك ، عادة ما توجد جداول بيانات تعريف متعددة تحتوي على معلومات متعلقة بالسمات ، وستتم مناقشتها قريبًا.

القيمة تحرير

يؤدي فرض جميع القيم إلى سلاسل ، كما في مثال بيانات EAV أعلاه ، إلى بنية بسيطة ، ولكن غير قابلة للتطوير: التحويلات البينية لنوع البيانات الثابت مطلوبة إذا أراد المرء فعل أي شيء بالقيم ، ومؤشر على القيمة عمود جدول EAV عديم الفائدة بشكل أساسي. أيضًا ، ليس من الملائم تخزين بيانات ثنائية كبيرة ، مثل الصور ، في شكل مشفر Base64 في نفس الجدول مثل الأعداد الصحيحة الصغيرة أو السلاسل. لذلك ، تستخدم الأنظمة الأكبر جداول EAV منفصلة لكل نوع بيانات (بما في ذلك الكائنات الثنائية الكبيرة ، "BLOBS") ، مع البيانات الوصفية لسمة معينة تحدد جدول EAV الذي سيتم تخزين بياناته فيه. هذا النهج فعال للغاية في الواقع لأن المقدار المتواضع من البيانات الوصفية للسمات لفئة معينة أو النموذج الذي يختاره المستخدم للعمل معه يمكن تخزينه مؤقتًا بسهولة في الذاكرة. ومع ذلك ، فإنه يتطلب نقل البيانات من جدول إلى آخر إذا تم تغيير نوع بيانات السمة.

نشأت EAV ، كوسيلة للأغراض العامة لتمثيل المعرفة ، بمفهوم "قوائم الارتباط" (أزواج السمة والقيمة). يشيع استخدامها اليوم ، وقد تم تقديمها لأول مرة في اللغة LISP. [1] تُستخدم أزواج السمة والقيمة على نطاق واسع للتطبيقات المتنوعة ، مثل ملفات التكوين (باستخدام بناء جملة بسيط مثل السمة = القيمة). مثال على استخدام EAV بدون قاعدة بيانات في UIMA (هندسة إدارة المعلومات غير المهيكلة) ، وهو معيار تديره مؤسسة Apache حاليًا ويتم استخدامه في مجالات مثل معالجة اللغة الطبيعية. عادةً ما يقوم البرنامج الذي يحلل النص بترميز ("التعليقات التوضيحية") على مقطع: المثال المقدم في البرنامج التعليمي UIMA هو برنامج يقوم بتنفيذ التعرف على الكيانات المسماة (NER) على مستند ، مع وضع تعليق توضيحي على مقطع النص "الرئيس بوش" مع التعليق التوضيحي- السمة والقيمة ثلاثية (الشخص ، الاسم الكامل ، "جورج دبليو بوش"). [2] يمكن تخزين هذه التعليقات التوضيحية في جدول قاعدة البيانات.

في حين أن EAV ليس لديها اتصال مباشر بأزواج AV ، يبدو أن Stead و Hammond هما أول من تصور استخدامها للتخزين المستمر للبيانات المعقدة بشكل تعسفي. [3] كانت أنظمة السجلات الطبية الأولى التي استخدمت EAV هي السجل الطبي الإلكتروني Regenstrief (الجهد الذي قاده Clement MacDonald) ، [4] نظام William Stead و Ed Hammond's TMR (السجل الطبي) ومستودع HELP Clinical Data Repository (CDR) تم إنشاؤها بواسطة مجموعة هومر وارنر في مستشفى LDS ، سولت ليك سيتي ، يوتا. [5] [6] (استخدم نظام إعادة الملخص في الواقع تصميمًا لقيمة المريض - سمة - طابع زمني - قيمة: استخدام الطابع الزمني يدعم استرجاع القيم لمريض / سمة معينة بترتيب زمني.) كل هذه الأنظمة ، التي تم تطويرها في السبعينيات. ، قبل أن تتوفر الأنظمة التجارية المستندة إلى نموذج قاعدة البيانات العلائقية الخاصة بـ EF Codd ، على الرغم من أن HELP تم نقلها لاحقًا إلى بنية علائقية وتم تسويقها بواسطة شركة 3M. (لاحظ أنه بينما نُشرت ورقة Codd التاريخية في عام 1970 ، كان لهجة الرياضيات الشديدة تأثير مؤسف يتمثل في تقليص إمكانية الوصول إليها بين الأنواع غير المرتبطة بعلوم الكمبيوتر ، وبالتالي تأخير قبول النموذج في دوائر تكنولوجيا المعلومات وبائعي البرامج. قيمة اللاحقة لا يمكن المبالغة في مساهمة كريستوفر جيه دايت ، زميل Codd في شركة IBM ، في ترجمة هذه الأفكار إلى لغة يسهل الوصول إليها ، مصحوبة بأمثلة بسيطة توضح قوتها.)

كانت مجموعة في مركز كولومبيا المشيخية الطبي أول من استخدم محرك قاعدة البيانات العلائقية كأساس لنظام EAV. [7]

نظام إدارة بيانات الدراسة السريرية TrialDB مفتوح المصدر لـ Nadkarni et al. كان أول من استخدم جداول EAV متعددة ، واحد لكل نوع بيانات DBMS. [8]

إن إطار عمل EAV / CR ، المصمم بشكل أساسي من قبل لويس مارينكو وبراكاش نادكارني ، غطى مبادئ توجيه الكائن على EAV [9] الذي تم بناؤه على نهج جدول كائنات Tom Slezak (الموصوف سابقًا في قسم "الكيان"). تم تصميم SenseLab ، وهي قاعدة بيانات خاصة بعلوم الأعصاب يمكن الوصول إليها للجمهور ، باستخدام إطار عمل EAV / CR.

يشير مصطلح "قاعدة بيانات EAV" إلى تصميم قاعدة بيانات حيث يتم نمذجة نسبة كبيرة من البيانات على أنها EAV. ومع ذلك ، حتى في قاعدة البيانات التي توصف بأنها "قائمة على EAV" ، فإن بعض الجداول في النظام هي جداول علائقية تقليدية.

كما هو مذكور أعلاه ، فإن نمذجة EAV منطقية لفئات البيانات ، مثل النتائج السريرية ، حيث تكون السمات عديدة ومتفرقة. عندما لا تنطبق هذه الشروط ، يفضل استخدام النمذجة العلائقية القياسية (أي عمود واحد لكل سمة) باستخدام EAV لا يعني التخلي عن الفطرة السليمة أو مبادئ التصميم العلائقي الجيد. في أنظمة السجلات السريرية ، يتم عادةً تصميم المخططات الفرعية التي تتعامل مع التركيبة السكانية للمريض والفواتير بشكل تقليدي. (على الرغم من أن معظم مخططات قواعد بيانات البائعين ملكية خاصة ، إلا أن نظام VistA المستخدم في جميع أنحاء النظام الطبي التابع لوزارة شؤون المحاربين القدامى بالولايات المتحدة (VA) ، والمعروف باسم إدارة صحة المحاربين القدامى (VHA) ، [10] مفتوح المصدر ومخططه متاح بسهولة قابل للفحص ، على الرغم من أنه يستخدم محرك قاعدة بيانات MUMPS بدلاً من قاعدة بيانات علائقية.)

كما تمت مناقشته باختصار ، فإن قاعدة بيانات EAV غير قابلة للاستمرار بشكل أساسي بدون العديد من الجداول الداعمة التي تحتوي على بيانات وصفية داعمة. عادةً ما تكون جداول البيانات الوصفية ، التي يفوق عددها عادةً جداول EAV بعامل لا يقل عن ثلاثة أو أكثر ، جداول ارتباطية قياسية. [8] [9] مثال على جدول البيانات الوصفية هو جدول تعريفات السمات المذكور أعلاه.

في تصميم EAV البسيط ، تكون قيم السمة أنواع بيانات بسيطة أو بدائية بقدر ما يتعلق الأمر بمحرك قاعدة البيانات. ومع ذلك ، في أنظمة EAV المستخدمة لتمثيل البيانات شديدة التنوع ، من الممكن أن يكون لكائن معين (مثيل فئة) بنية فرعية: أي أن بعض سماته قد تمثل أنواعًا أخرى من الكائنات ، والتي بدورها قد تحتوي على بنية أساسية مستوى تعقيد من التعقيد. سيارة ، على سبيل المثال ، لديها محرك ، وناقل حركة ، وما إلى ذلك ، والمحرك يحتوي على مكونات مثل الأسطوانات. (يتم تحديد البنية التحتية المسموح بها لفئة معينة ضمن البيانات الوصفية لسمات النظام ، كما تمت مناقشته لاحقًا. وبالتالي ، على سبيل المثال ، يمكن تطبيق السمة "ذاكرة الوصول العشوائي" على الفئة "الكمبيوتر" ولكن ليس على الفئة "المحرك" .)

لتمثيل البنية التحتية ، يقوم المرء بدمج جدول EAV خاص حيث يحتوي عمود القيمة على مراجع إلى آخر الكيانات في النظام (على سبيل المثال ، قيم المفاتيح الخارجية في جدول الكائنات). للحصول على جميع المعلومات حول كائن معين ، يتطلب اجتياز متكرر للبيانات الوصفية ، متبوعًا بمسح متكرر للبيانات التي تتوقف عندما تكون كل سمة يتم استردادها بسيطة (ذرية). يعد الاجتياز العودي ضروريًا سواء تم تمثيل تفاصيل فئة فردية في شكل تقليدي أو EAV يتم تنفيذ هذا الاجتياز في أنظمة ارتباط كائن قياسية ، على سبيل المثال. من الناحية العملية ، يميل عدد مستويات العودية إلى أن يكون متواضعًا نسبيًا لمعظم الفئات ، لذا فإن عقوبات الأداء بسبب العودية متواضعة ، خاصة مع فهرسة معرفات الكائنات.

يشير EAV / CR (EAV مع الفئات والعلاقات) [11] [12] [13] إلى إطار عمل يدعم البنية التحتية المعقدة. اسمها تسمية خاطئة إلى حد ما: في حين أنها كانت نتاجًا للعمل على أنظمة EAV ، من الناحية العملية ، يمكن تمثيل العديد من الفئات أو حتى معظمها في مثل هذا النظام في شكل علائقي قياسي ، بناءً على ما إذا كانت السمات متفرقة أو كثيفة . تتميز EAV / CR ببيانات وصفية مفصلة للغاية ، وهي غنية بما يكفي لدعم الإنشاء التلقائي لواجهات التصفح للفئات الفردية دون الحاجة إلى كتابة رمز واجهة المستخدم لكل فئة على حدة. أساس واجهات المستعرض هذه هو أنه من الممكن إنشاء مجموعة من استعلامات SQL الديناميكية المستقلة عن فئة الكائن ، من خلال استشارة البيانات الوصفية أولاً واستخدام معلومات البيانات الوصفية لإنشاء سلسلة من الاستعلامات مقابل جداول البيانات ، و قد تكون بعض طلبات البحث هذه متكررة بشكل تعسفي. يعمل هذا النهج جيدًا مع استعلامات الكائن في وقت واحد ، كما هو الحال في واجهات التصفح القائمة على الويب حيث يؤدي النقر فوق اسم كائن إلى إظهار جميع تفاصيل الكائن في صفحة منفصلة: البيانات الوصفية المرتبطة بفئة هذا الكائن تسهل أيضًا عرض تفاصيل الكائن ، لأنه يتضمن تعليقات لسمات فردية ، وترتيب تقديمها وكذلك كيفية تجميعها.

تتمثل إحدى طرق EAV / CR في السماح للأعمدة بحمل هياكل JSON ، والتي توفر بالتالي بنية الفئة المطلوبة. على سبيل المثال ، تقدم PostgreSQL ، اعتبارًا من الإصدار 9.4 ، دعم العمود الثنائي JSON (JSONB) ، مما يسمح بالاستعلام عن سمات JSON وفهرستها وضمها.

على حد تعبير الأستاذ الدكتور دانيال ماسيز (رئيس قسم المعلوماتية الطبية بجامعة فاندربيلت سابقًا) ، فإن تحديات العمل مع EAV تنبع من حقيقة أنه في قاعدة بيانات EAV ، فإن "المخطط المادي" (طريقة تخزين البيانات) هو يختلف اختلافًا جذريًا عن "المخطط المنطقي" - الطريقة التي ينظر بها المستخدمون والعديد من تطبيقات البرامج مثل حزم الإحصائيات ، أي الصفوف والأعمدة التقليدية للفئات الفردية. (نظرًا لأن جدول EAV يمزج من الناحية المفاهيمية بين التفاح والبرتقال والجريب فروت و Chop suey ، إذا كنت تريد إجراء أي تحليل للبيانات باستخدام برنامج قياسي جاهز للاستخدام ، في معظم الحالات ، يتعين عليك تحويل مجموعات فرعية منه إلى شكل عمودي. [ 14] عملية القيام بذلك ، والتي تسمى التمحور ، مهمة بما يكفي لمناقشتها بشكل منفصل.)

تساعد البيانات الوصفية في أداء خفة اليد التي تتيح للمستخدمين التفاعل مع النظام من حيث المخطط المنطقي بدلاً من المادي: يستشير البرنامج باستمرار البيانات الوصفية للعمليات المختلفة مثل عرض البيانات والتحقق التفاعلي واستخراج البيانات بالجملة والاستعلام المخصص. يمكن استخدام البيانات الوصفية في الواقع لتخصيص سلوك النظام.

تستبدل أنظمة EAV البساطة في البنية المادية والمنطقية للبيانات بالتعقيد في بياناتها الوصفية ، والتي تلعب ، من بين أشياء أخرى ، الدور الذي تؤديه قيود قاعدة البيانات والتكامل المرجعي في تصميمات قواعد البيانات القياسية. هذه المقايضة جديرة بالاهتمام بشكل عام ، لأنه في المخطط المختلط النموذجي لأنظمة الإنتاج ، يمكن أن تستفيد البيانات الموجودة في الجداول العلائقية التقليدية أيضًا من وظائف مثل إنشاء الواجهة تلقائيًا. هيكل البيانات الوصفية معقد بدرجة كافية بحيث يشتمل على مخطط فرعي خاص به داخل قاعدة البيانات: تشير المفاتيح الخارجية المختلفة في جداول البيانات إلى الجداول الموجودة في هذا المخطط الفرعي. هذا المخطط الفرعي هو معيار العلائقية ، مع ميزات مثل القيود والتكامل المرجعي المستخدمة إلى أقصى حد.

تعد صحة محتويات البيانات الوصفية ، من حيث سلوك النظام المقصود ، أمرًا بالغ الأهمية ، وتعني مهمة ضمان الصحة أنه عند إنشاء نظام EAV ، يجب بذل جهود تصميم كبيرة في بناء واجهات مستخدم لتحرير البيانات الوصفية التي يمكن أن يستخدمها الأشخاص في الفريق الذي يعرف مجال المشكلة (مثل الطب السريري) لكن ليسوا بالضرورة مبرمجين. (تاريخيًا ، كان أحد الأسباب الرئيسية لفشل اعتماد نظام TMR قبل العلائقية في مواقع أخرى غير مؤسسته الرئيسية هو تخزين جميع البيانات الوصفية في ملف واحد بهيكل غير بديهي. تخصيص سلوك النظام عن طريق تغيير المحتويات من هذا الملف ، دون التسبب في تعطل النظام ، كانت مهمة حساسة لدرجة أن مؤلفي النظام وثقوا بأنفسهم فقط للقيام بذلك).

عندما يتم تنفيذ نظام EAV من خلال RDF ، يمكن استخدام لغة مخطط RDF بشكل ملائم للتعبير عن هذه البيانات الوصفية. يمكن بعد ذلك استخدام معلومات المخطط هذه بواسطة محرك قاعدة بيانات EAV لإعادة تنظيم هيكل الجدول الداخلي بشكل ديناميكي لتحقيق أفضل كفاءة. [15]

بعض التحذيرات النهائية المتعلقة بالبيانات الوصفية:

  • نظرًا لأن منطق الأعمال موجود في البيانات الوصفية وليس واضحًا في مخطط قاعدة البيانات (على سبيل المثال ، تمت إزالة مستوى واحد ، مقارنةً بالأنظمة المصممة تقليديًا) ، فهو أقل وضوحًا لمن ليس على دراية بالنظام. لذلك ، تعد أدوات تصفح البيانات الوصفية والإبلاغ عن البيانات الوصفية مهمة في ضمان إمكانية صيانة نظام EAV. في السيناريو الشائع حيث يتم تنفيذ البيانات الوصفية كمخطط فرعي علائقي ، فإن هذه الأدوات ليست أكثر من تطبيقات تم إنشاؤها باستخدام أدوات إعداد التقارير الجاهزة أو الاستعلام التي تعمل على جداول البيانات الوصفية.
  • من السهل على المستخدم الذي ليس لديه معرفة كافية أن يفسد (أي إدخال تناقضات وأخطاء في) البيانات الوصفية. لذلك ، يجب تقييد الوصول إلى البيانات الوصفية ، ووضع مسار تدقيق لعمليات الوصول والتغييرات للتعامل مع المواقف التي يمتلك فيها العديد من الأفراد إمكانية الوصول إلى البيانات الوصفية. سيؤدي استخدام RDBMS للبيانات الوصفية إلى تبسيط عملية الحفاظ على الاتساق أثناء إنشاء البيانات الوصفية وتحريرها ، من خلال الاستفادة من ميزات RDBMS مثل دعم المعاملات. أيضًا ، إذا كانت البيانات الوصفية جزءًا من نفس قاعدة البيانات مثل البيانات نفسها ، فهذا يضمن أنه سيتم نسخها احتياطيًا على الأقل في كثير من الأحيان مثل البيانات نفسها ، بحيث يمكن استعادتها إلى نقطة زمنية.
  • يجب أن تكون جودة التعليق التوضيحي والتوثيق داخل البيانات الوصفية (أي النص السردي / التوضيحي في الأعمدة الوصفية للمخطط الفرعي للبيانات الوصفية) أعلى بكثير ، من أجل تسهيل الفهم من قبل مختلف أعضاء فريق التطوير. إن ضمان جودة البيانات الوصفية (وإبقائها حديثة مع تطور النظام) يأخذ أولوية عالية جدًا في الإدارة طويلة المدى وصيانة أي تصميم يستخدم مكون EAV. يمكن أن تؤدي البيانات الوصفية غير الموثقة أو القديمة إلى تعريض صلاحية النظام على المدى الطويل للخطر. [16] [17]

المعلومات التي تم التقاطها في تحرير البيانات الوصفية

تحرير البيانات الوصفية للسمة

  • البيانات الوصفية للتحقق من الصحة تضمين نوع البيانات ، ونطاق القيم المسموح بها أو العضوية في مجموعة من القيم ، ومطابقة التعبير العادي ، والقيمة الافتراضية ، وما إذا كان يُسمح بأن تكون القيمة خالية. في أنظمة EAV التي تمثل الفئات ذات البنية التحتية ، ستسجل البيانات الوصفية للتحقق أيضًا الفئة ، إن وجدت ، التي تنتمي إليها سمة معينة.
  • البيانات الوصفية للعرض التقديمي: كيف يتم عرض السمة للمستخدم (على سبيل المثال ، كمربع نص أو صورة ذات أبعاد محددة ، أو قائمة منسدلة أو مجموعة من أزرار الاختيار). عندما يتكون كائن مركب من سمات متعددة ، كما هو الحال في تصميم EAV / CR ، هناك بيانات وصفية إضافية بالترتيب الذي يجب تقديم السمات به ، وكيف يجب تجميع هذه السمات اختياريًا (تحت عناوين وصفية).
  • بالنسبة للسمات التي تكون معلمات معملية ، نطاقات من القيم العادية، والتي قد تختلف حسب العمر والجنس والحالة الفسيولوجية وطريقة الفحص ، يتم تسجيلها.
  • تجميع البيانات الوصفية: عادةً ما يتم تقديم السمات كجزء من مجموعة ذات ترتيب أعلى ، على سبيل المثال ، نموذج خاص بالتخصص. تتضمن بيانات التعريف المجمعة معلومات مثل الترتيب الذي يتم به عرض السمات. تنطبق بعض البيانات الوصفية للعرض التقديمي ، مثل الخطوط / الألوان وعدد السمات المعروضة في كل صف ، على المجموعة ككل.

تحرير بيانات التعريف المتقدمة للتحقق

  • بيانات تعريف التبعية: في العديد من واجهات المستخدم ، يلزم إدخال قيم محددة في حقول / سمات معينة إما لتعطيل / إخفاء بعض الحقول الأخرى أو تمكين / إظهار الحقول الأخرى. (على سبيل المثال ، إذا اختار المستخدم الإجابة "لا" على سؤال منطقي "هل المريض مصاب بمرض السكري؟" ، فيجب تعطيل الأسئلة اللاحقة حول مدة مرض السكري وأدوية السكري وما إلى ذلك.) لتفعيل ذلك في يتضمن الإطار العام تخزين التبعيات بين سمات التحكم والسمات الخاضعة للرقابة.
  • الحسابات والتحقق المعقد: كما هو الحال في جدول البيانات ، يمكن حساب قيمة سمات معينة وعرضها ، بناءً على القيم التي تم إدخالها في الحقول التي تم تقديمها مسبقًا بالتسلسل. (على سبيل المثال ، مساحة سطح الجسم هي دالة للارتفاع والعرض). وبالمثل ، قد تكون هناك "قيود" يجب أن تكون صحيحة حتى تكون البيانات صحيحة: على سبيل المثال ، في تعداد الخلايا البيضاء التفاضلية ، يجب أن يساوي مجموع تعداد أنواع الخلايا البيضاء الفردية دائمًا 100 ، لأن الأعداد الفردية تمثل النسب المئوية. تتأثر الصيغ المحسوبة والتحقق المعقد عمومًا من خلال تخزين التعبيرات في البيانات الوصفية التي يتم استبدالها بشكل كبير بالقيم التي يدخلها المستخدم ويمكن تقييمها. في متصفحات الويب ، يحتوي كل من JavaScript و VBScript على وظيفة Eval () التي يمكن الاستفادة منها لهذا الغرض.

يتيح التحقق من الصحة والعرض التقديمي وتجميع البيانات الوصفية إمكانية إنشاء أطر عمل التعليمات البرمجية التي تدعم إنشاء واجهة المستخدم تلقائيًا لتصفح البيانات وكذلك التحرير التفاعلي. في نظام الإنتاج الذي يتم تسليمه عبر الويب ، يتم نقل مهمة التحقق من صحة بيانات EAV بشكل أساسي من طبقة النهاية الخلفية / قاعدة البيانات (التي لا تمتلك قوة فيما يتعلق بهذه المهمة) إلى الطبقة الوسطى / خادم الويب. في حين أن التحقق من صحة النهاية الخلفية يكون دائمًا مثاليًا ، لأنه من المستحيل التخريب عن طريق محاولة إدخال البيانات مباشرة في جدول ، فإن التحقق من المستوى المتوسط ​​من خلال إطار عمل عام يكون قابلاً للتطبيق تمامًا ، على الرغم من أنه يجب بذل قدر كبير من جهود تصميم البرامج في بناء إطار العمل أولاً . يمكن أن يؤدي توافر أطر عمل مفتوحة المصدر يمكن دراستها وتعديلها للاحتياجات الفردية إلى قطع شوط طويل في تجنب إعادة اختراع العجلة. [ بحاجة لمصدر ]

(الجزء الأول من هذا القسم هو ملخص للمقالة المرجعية Dinu / Nadkarni في Central ، [18] والتي يتم توجيه القارئ إليها لمزيد من التفاصيل.)

لطالما كانت نمذجة EAV ، تحت المصطلحات البديلة "نمذجة البيانات العامة" أو "المخطط المفتوح" ، أداة قياسية لمصممي البيانات المتقدمين. مثل أي تقنية متقدمة ، يمكن أن تكون ذات حدين ، ويجب استخدامها بحكمة.

أيضًا ، لا يمنع استخدام EAV استخدام أساليب نمذجة قواعد البيانات العلائقية التقليدية في نفس مخطط قاعدة البيانات. في EMRs التي تعتمد على RDBMS ، مثل Cerner ، التي تستخدم نهج EAV لمخطط البيانات السريرية الفرعية ، فإن الغالبية العظمى من الجداول في المخطط تم تصميمها في الواقع بشكل تقليدي ، مع تمثيل السمات كأعمدة فردية بدلاً من الصفوف.

في الواقع ، تعد نمذجة المخطط الفرعي للبيانات الوصفية لنظام EAV مناسبًا جدًا للنمذجة التقليدية ، بسبب العلاقات المتبادلة بين المكونات المختلفة للبيانات الوصفية. في نظام TrialDB ، على سبيل المثال ، يفوق عدد جداول البيانات الوصفية في المخطط عدد جداول البيانات بحوالي عشرة إلى واحد. نظرًا لأن صحة واتساق البيانات الوصفية أمر بالغ الأهمية للتشغيل الصحيح لنظام EAV ، فإن مصمم النظام يريد الاستفادة الكاملة من جميع الميزات التي توفرها أنظمة RDBMS ، مثل التكامل المرجعي والقيود القابلة للبرمجة ، بدلاً من الاضطرار إلى إعادة اختراع RDBMS - عجلة محرك. وبالتالي ، فإن جداول البيانات الوصفية العديدة التي تدعم تصميمات EAV تكون عادةً في شكل علائقي ثالث عادي.

Commercial electronic health record Systems (EHRs) use row-modeling for classes of data such as diagnoses, surgical procedures performed on and laboratory test results, which are segregated into separate tables. In each table, the "entity" is a composite of the patient ID and the date/time the diagnosis was made (or the surgery or lab test performed) the attribute is a foreign key into a specially designated lookup table that contains a controlled vocabulary - e.g., ICD-10 for diagnoses, Current Procedural Terminology for surgical procedures, with a set of value attributes. (E.g., for laboratory-test results, one may record the value measured, whether it is in the normal, low or high range, the ID of the person responsible for performing the test, the date/time the test was performed, and so on.) As stated earlier, this is not a full-fledged EAV approach because the domain of attributes for a given table is restricted, just as the domain of product IDs in a supermarket's Sales table would be restricted to the domain of Products in a Products table.

However, to capture data on parameters that are not always defined in standard vocabularies, EHRs also provide a "pure" EAV mechanism, where specially designated power-users can define new attributes, their data type, maximum and minimal permissible values (or permissible set of values/codes), and then allow others to capture data based on these attributes. In the Epic (TM) EHR, this mechanism is termed "Flowsheets", and is commonly used to capture inpatient nursing observation data.

Modeling sparse attributes Edit

The typical case for using the EAV model is for highly sparse, heterogeneous attributes, such as clinical parameters in the electronic medical record (EMRs), as stated above. Even here, however, it is accurate to state that the EAV modeling principle is applied to a sub-schema of the database rather than for all of its contents. (Patient demographics, for example, are most naturally modeled in one-column-per-attribute, traditional relational structure.)

Consequently, the arguments about EAV vs. "relational" design reflect incomplete understanding of the problem: An EAV design should be employed only for that sub-schema of a database where sparse attributes need to be modeled: even here, they need to be supported by third normal form metadata tables. There are relatively few database-design problems where sparse attributes are encountered: this is why the circumstances where EAV design is applicable are relatively rare. Even where they are encountered, a set of EAV tables is not the only way to address sparse data: an XML-based solution (discussed below) is applicable when the maximum number of attributes per entity is relatively modest, and the total volume of sparse data is also similarly modest. An example of this situation is the problems of capturing variable attributes for different product types.

Sparse attributes may also occur in E-commerce situations where an organization is purchasing or selling a vast and highly diverse set of commodities, with the details of individual categories of commodities being highly variable. The Magento E-commerce software [19] employs an EAV approach to address this issue.

Modeling numerous classes with very few instances per class: highly dynamic schemas Edit

Another application of EAV is in modeling classes and attributes that, while not sparse, are dynamic, but where the number of data rows per class will be relatively modest – a couple of hundred rows at most, but typically a few dozen – and the system developer is also required to provide a Web-based end-user interface within a very short turnaround time. "Dynamic" means that new classes and attributes need to be continually defined and altered to represent an evolving data model. This scenario can occur in rapidly evolving scientific fields as well as in ontology development, especially during the prototyping and iterative refinement phases.

While creation of new tables and columns to represent a new category of data is not especially labor-intensive, the programming of Web-based interfaces that support browsing or basic editing with type- and range-based validation is. In such a case, a more maintainable long-term solution is to create a framework where the class and attribute definitions are stored in metadata, and the software generates a basic user interface from this metadata dynamically.

The EAV/CR framework, mentioned earlier, was created to address this very situation. Note that an EAV data model is not essential here, but the system designer may consider it an acceptable alternative to creating, say, sixty or more tables containing a total of not more than two thousand rows. Here, because the number of rows per class is so few, efficiency considerations are less important with the standard indexing by class ID/attribute ID, DBMS optimizers can easily cache the data for a small class in memory when running a query involving that class or attribute.

In the dynamic-attribute scenario, it is worth noting that Resource Description Framework (RDF) is being employed as the underpinning of Semantic-Web-related ontology work. RDF, intended to be a general method of representing information, is a form of EAV: an RDF triple comprises an object, a property, and a value.

At the end of Jon Bentley's book "Writing Efficient Programs", the author warns that making code more efficient generally also makes it harder to understand and maintain, and so one does not rush in and tweak code unless one has first determined that there يكون a performance problem, and measures such as code profiling have pinpointed the exact location of the bottleneck. Once you have done so, you modify only the specific code that needs to run faster. Similar considerations apply to EAV modeling: you apply it only to the sub-system where traditional relational modeling is known a priori to be unwieldy (as in the clinical data domain), or is discovered, during system evolution, to pose significant maintenance challenges. Database Guru (and currently a vice-president of Core Technologies at Oracle Corporation) Tom Kyte, [20] for example, correctly points out drawbacks of employing EAV in traditional business scenarios, and makes the point that mere "flexibility" is not a sufficient criterion for employing EAV. (However, he makes the sweeping claim that EAV should be avoided in الكل circumstances, even though Oracle's Health Sciences division itself employs EAV to model clinical-data attributes in its commercial systems ClinTrial [21] and Oracle Clinical. [22] )

Working with EAV data Edit

The Achilles heel of EAV is the difficulty of working with large volumes of EAV data. It is often necessary to transiently or permanently inter-convert between columnar and row-or EAV-modeled representations of the same data this can be both error-prone if done manually as well as CPU-intensive. Generic frameworks that utilize attribute and attribute-grouping metadata address the former but not the latter limitation their use is more or less mandated in the case of mixed schemas that contain a mixture of conventional-relational and EAV data, where the error quotient can be very significant.

The conversion operation is called pivoting. Pivoting is not required only for EAV data but also for any form or row-modeled data. (For example, implementations of the Apriori algorithm for Association Analysis, widely used to process supermarket sales data to identify other products that purchasers of a given product are also likely to buy, pivot row-modeled data as a first step.) Many database engines have proprietary SQL extensions to facilitate pivoting, and packages such as Microsoft Excel also support it. The circumstances where pivoting is necessary are considered below.

  • Browsing of modest amounts of data for an individual entity, optionally followed by data editing based on inter-attribute dependencies. This operation is facilitated by caching the modest amounts of the requisite supporting metadata. Some programs, such as TrialDB, access the metadata to generate semi-static Web pages that contain embedded programming code as well as data structures holding metadata.
  • Bulk extraction transforms large (but predictable) amounts of data (e.g., a clinical study’s complete data) into a set of relational tables. While CPU-intensive, this task is infrequent and does not need to be done in real-time i.e., the user can wait for a batched process to complete. The importance of bulk extraction cannot be overestimated, especially when the data is to be processed or analyzed with standard third-party tools that are completely unaware of EAV structure. Here, it is not advisable to try to reinvent entire sets of wheels through a generic framework, and it is best just to bulk-extract EAV data into relational tables and then work with it using standard tools.
  • Ad hoc query interfaces to row- or EAV-modeled data, when queried from the perspective of individual attributes, (e.g., "retrieve all patients with the presence of liver disease, with signs of liver failure and no history of alcohol abuse") must typically show the results of the query with individual attributes as separate columns. For most EAV database scenarios ad hoc query performance must be tolerable, but sub-second responses are not necessary, since the queries tend to be exploratory in nature.

Relational division Edit

However, the structure of EAV data model is a perfect candidate for Relational Division, see relational algebra. With a good indexing strategy it's possible to get a response time in less than a few hundred milliseconds on a billion row EAV table. Microsoft SQL Server MVP Peter Larsson has proved this on a laptop and made the solution general available. [23]

Optimizing pivoting performance Edit

  • One possible optimization is the use of a separate "warehouse" or queryable schema whose contents are refreshed in batch mode from the production (transaction) schema. See data warehousing. The tables in the warehouse are heavily indexed and optimized using denormalization, which combines multiple tables into one to minimize performance penalty due to table joins.
  • Certain EAV data in a warehouse may be converted into standard tables using "materialized views" (see data warehouse), but this is generally a last resort that must be used carefully, because the number of views of this kind tends to grow non-linearly with the number of attributes in a system. [14]
  • In-memory data structures: One can use hash tables and two-dimensional arrays in memory in conjunction with attribute-grouping metadata to pivot data, one group at a time. This data is written to disk as a flat delimited file, with the internal names for each attribute in the first row: this format can be readily bulk-imported into a relational table. This "in-memory" technique significantly outperforms alternative approaches by keeping the queries on EAV tables as simple as possible and minimizing the number of I/O operations. [14] Each statement retrieves a large amount of data, and the hash tables help carry out the pivoting operation, which involves placing a value for a given attribute instance into the appropriate row and column. Random Access Memory (RAM) is sufficiently abundant and affordable in modern hardware that the complete data set for a single attribute group in even large data sets will usually fit completely into memory, though the algorithm can be made smarter by working on slices of the data if this turns out not to be the case.

Obviously, no matter what approaches you take, querying EAV will not be as fast as querying standard column-modeled relational data for certain types of query, in much the same way that access of elements in sparse matrices are not as fast as those on non-sparse matrices if the latter fit entirely into main memory. (Sparse matrices, represented using structures such as linked lists, require list traversal to access an element at a given X-Y position, while access to elements in matrices represented as 2-D arrays can be performed using fast CPU register operations.) If, however, you chose the EAV approach correctly for the problem that you were trying to solve, this is the price that you pay in this respect, EAV modeling is an example of a space (and schema maintenance) versus CPU-time tradeoff.

EAV vs. the Universal Data Model Edit

Originally postulated by Maier, Ullman and Vardi, [24] the "Universal Data Model" (UDM) seeks to simplify the query of a complex relational schema by naive users, by creating the illusion that everything is stored in a single giant "universal table". It does this by utilizing inter-table relationships, so that the user does not need to be concerned about what table contains what attribute. C.J. Date, however, [25] pointed out that in circumstances where a table is multiply related to another (as in genealogy databases, where an individual's father and mother are also individuals, or in some business databases where all addresses are stored centrally, and an organization can have different office addresses and shipping addresses), there is insufficient metadata within the database schema to specify unambiguous joins. When UDM has been commercialized, as in SAP BusinessObjects, this limitation is worked around through the creation of "Universes", which are relational views with predefined joins between sets of tables: the "Universe" developer disambiguates ambiguous joins by including the multiply-related table in a view multiple times using different aliases.

Apart from the way in which data is explicitly modeled (UDM simply uses relational views to intercede between the user and the database schema), EAV differs from Universal Data Models in that it also applies to transactional systems, not only query oriented (read-only) systems as in UDM. Also, when used as the basis for clinical-data query systems, EAV implementations do not necessarily shield the user from having to specify the class of an object of interest. In the EAV-based i2b2 clinical data mart, [26] for example, when the user searches for a term, she has the option of specifying the category of data that the user is interested in. For example, the phrase "lithium" can refer either to the medication (which is used to treat bipolar disorder), or a laboratory assay for lithium level in the patient's blood. (The blood level of lithium must be monitored carefully: too much of the drug causes severe side effects, while too little is ineffective.)

XML and JSON Edit

An Open Schema implementation can use an XML column in a table to capture the variable/sparse information. [27] Similar ideas can be applied to databases that support JSON-valued columns: sparse, hierarchical data can be represented as JSON. If the database has JSON support, such as PostgreSQL and (partially) SQL Server 2016 and later, then attributes can be queried, indexed and joined. This can offer performance improvements of over 1000x over naive EAV implementations., [28] but does not necessarily make the overall database application more robust.

Note that there are two ways in which XML or JSON data can be stored: one way is to store it as a plain string, opaque to the database server the other way is to use a database server that can "see into" the structure. There are obviously some severe drawbacks to storing opaque strings: these cannot be queried directly, one cannot form an index based on their contents, and it is impossible to perform joins based on the content.

Building an application that has to manage data gets extremely complicated when using EAV models, because of the extent of infrastructure that has to be developed in terms of metadata tables and application-framework code. Using XML solves the problem of server-based data validation (which must be done by middle-tier and browser-based code in EAV-based frameworks), but has the following drawbacks:

  • It is programmer-intensive. XML schemas are notoriously tricky to write by hand, a recommended approach is to create them by defining relational tables, generating XML-schema code, and then dropping these tables. This is problematic in many production operations involving dynamic schemas, where new attributes are required to be defined by power-users who understand a specific application domain (e.g. inventory management or biomedicine) but are not necessarily programmers. By contrast, in production systems that use EAV, such users define new attributes (and the data-type and validation checks associated with each) through a GUI application. Because the validation-associated metadata is required to be stored in multiple relational tables in a normalized design, a GUI application that ties these tables together and enforces the appropriate metadata-consistency checks is the only practical way to allow entry of attribute information, even for advanced developers - even if the end-result uses XML or JSON instead of separate relational tables.
  • The server-based diagnostics that result with an XML/JSON solution if incorrect data is attempted to be inserted (e.g., range check or regular-expression pattern violations) are cryptic to the end-user: to convey the error accurately, one would, at the least, need to associate a detailed and user-friendly error diagnostic with each attribute.
  • The solution does not address the user-interface-generation problem.

All of the above drawbacks are remediable by creating a layer of metadata and application code, but in creating this, the original "advantage" of not having to create a framework has vanished. The fact is that modeling sparse data attributes robustly is a hard database-application-design problem no matter which storage approach is used. Sarka's work, [27] however, proves the viability of using an XML field instead of type-specific relational EAV tables for the data-storage layer, and in situations where the number of attributes per entity is modest (e.g., variable product attributes for different product types) the XML-based solution is more compact than an EAV-table-based one. (XML itself may be regarded as a means of attribute-value data representation, though it is based on structured text rather than on relational tables.)

Tree structures and relational databases Edit

There exist several other approaches for the representation of tree-structured data, be it XML, JSON or other formats, such as the nested set model, in a relational database. On the other hand, database vendors have begun to include JSON and XML support into their data structures and query features, like in IBM DB2, where XML data is stored as XML separate from the tables, using XPath queries as part of SQL statements, or in PostgreSQL, with a JSON data type [29] that can be indexed and queried. These developments accomplish, improve or substitute the EAV model approach.

The uses of JSON and XML are not necessarily the same as the use of an EAV model, though they can overlap. XML is preferable to EAV for arbitrarily hierarchical data that is relatively modest in volume for a single entity: it is not intended to scale up to the multi-gigabyte level with respect to data-manipulation performance. [ بحاجة لمصدر ] XML is not concerned per-se with the sparse-attribute problem, and when the data model underlying the information to be represented can be decomposed straightforwardly into a relational structure, XML is better suited as a means of data interchange than as a primary storage mechanism. EAV, as stated earlier, is specifically (and only) applicable to the sparse-attribute scenario. When such a scenario holds, the use of datatype-specific attribute-value tables than can be indexed by entity, by attribute, and by value and manipulated through simple SQL statements is vastly more scalable than the use of an XML tree structure. [ بحاجة لمصدر ] The Google App Engine, mentioned above, [ بحاجة لمصدر ] uses strongly-typed-value tables for a good reason. [ بحاجة لمصدر ]

Graph databases Edit

An alternative approach to managing the various problems encountered with EAV-structured data is to employ a graph database. These represent entities as the nodes of a graph or hypergraph, and attributes as links or edges of that graph. The issue of table joins are addressed by providing graph-specific query languages, such as Apache TinkerPop, [30] or the OpenCog atomspace pattern matcher. [31]

Another alternative is to use SPARQL store.

PostgreSQL: JSONB columns Edit

PostgreSQL version 9.4 includes support for JSON binary columns (JSONB), which can be queried, indexed and joined. This allows performance improvements by factors of a thousand or more over traditional EAV table designs. [28]

A db schema based on JSONB always has fewer tables: one may nest attribute-value pairs in JSONB type fields of the Entity table. That makes the db schema easy to comprehend and SQL queries concise. [32] The programming code to manipulate the database objects on the abstraction layer turns out much shorter. [33]

SQL Server 2008 and later: Sparse columns Edit

Microsoft SQL Server 2008 offers a (proprietary) alternative to EAV. [34] Columns with an atomic data type (e.g., numeric, varchar or datetime columns) can be designated as sparse simply by including the word SPARSE in the column definition of the CREATE TABLE statement. Sparse columns optimize the storage of NULL values (which now take up no space at all) and are useful when the majority records in a table will have NULL values for that column. Indexes on sparse columns are also optimized: only those rows with values are indexed. In addition, the contents of all sparse columns in a particular row of a table can be collectively aggregated into a single XML column (a column set), whose contents are of the form [<column-name>column contents </column-name>]*. In fact, if a column set is defined for a table as part of a CREATE TABLE statement, all sparse columns subsequently defined are typically added to it. This has the interesting consequence that the SQL statement SELECT * from <tablename> will not return the individual sparse columns, but concatenate all of them into a single XML column whose name is that of the column set (which therefore acts as a virtual, computed column). Sparse columns are convenient for business applications such as product information, where the applicable attributes can be highly variable depending on the product type, but where the total number of variable attributes per product type are relatively modest.

Limitations of Sparse Attributes Edit

However, this approach to modeling sparse attributes has several limitations: rival DBMSs have, notably, chosen not to borrow this idea for their own engines. Limitations include:

  • The maximum number of sparse columns in a table is 10,000, which may fall short for some implementations, such as for storing clinical data, where the possible number of attributes is one order of magnitude larger. Therefore, this is not a solution for modeling *all* possible clinical attributes for a patient.
  • Addition of new attributes – one of the primary reasons an EAV model might be sought – still requires a DBA. Further, the problem of building a user interface to sparse attribute data is not addressed: only the storage mechanism is streamlined. * Applications can be written to dynamically add and remove sparse columns from a table at run-time: in contrast, an attempt to perform such an action in a multi-user scenario where other users/processes are still using the table would be prevented for tables without sparse columns. However, while this capability offers power and flexibility, it invites abuse, and should be used judiciously and infrequently.
    • It can result in significant performance penalties, in part because any compiled query plans that use this table are automatically invalidated.
    • Dynamic column addition or removal is an operation that should be audited, because column removal can cause data loss: allowing an application to modify a table without maintaining some kind of a trail, including a justification for the action, is not good software practice.

    Many cloud computing vendors offer data stores based on the EAV model, where an arbitrary number of attributes can be associated with a given entity. Roger Jennings provides an in-depth comparison [35] of these. In Amazon's offering, SimpleDB, the data type is limited to strings, and data that is intrinsically non-string must be coerced to string (e.g., numbers must be padded with leading zeros) if you wish to perform operations such as sorting. Microsoft's offering, Windows Azure Table Storage, offers a limited set of data types: byte[], bool, DateTime, double, Guid, int, long and string [1]. The Google App Engine [2] offers the greatest variety of data types: in addition to dividing numeric data into int, long, or float, it also defines custom data types such as phone number, E-mail address, geocode and hyperlink. Google, but not Amazon or Microsoft, lets you define metadata that would prevent invalid attributes from being associated with a particular class of entity, by letting you create a metadata model.

    Google lets you operate on the data using a subset of SQL Microsoft offer a URL-based querying syntax that is abstracted via a LINQ provider Amazon offer a more limited syntax. Of concern, built-in support for combining different entities through joins is currently (April '10) non-existent with all three engines. Such operations have to be performed by application code. This may not be a concern if the application servers are co-located with the data servers at the vendor's data center, but a lot of network traffic would be generated if the two were geographically separated.

    An EAV approach is justified only when the attributes that are being modeled are numerous and sparse: if the data being captured does not meet this requirement, the cloud vendors' default EAV approach is often a mismatch for applications that require a true back-end database (as opposed to merely a means of persistent data storage). Retrofitting the vast majority of existing database applications, which use a traditional data-modeling approach, to an EAV-type cloud architecture, would require major surgery. Microsoft discovered, for example, that its database-application-developer base was largely reluctant to invest such effort. More recently, therefore, Microsoft has provided a premium offering – a cloud-accessible full-fledged relational engine, SQL Server Azure, which allows porting of existing database applications with modest changes.

    One limitation of SQL Azure is that physical databases are limited to 500 GB in size as of January 2015 [update] . [36] Microsoft recommends that data sets larger than this be split into multiple physical databases and accessed with parallel queries.


    How to use the Sample Excel?

    Example scenario

    The purpose of the following sample Excel template is to change the ABC classification of ByD supplier:

    1. Query and download all relevant supplier from ByD into your Excel template
    2. Change the ABC classification of the supplier offline
    3. Write back the changed supplier ABC classifications to ByD

    To ensure data integrity and to avoid accidental changes, you would like to make sure, that the Excel can be used to change the ABC classification of existing suppliers only. It shall not be possible to create supplier, to delete supplier or to change any other supplier data except the ABC classification.

    The sample Excel template SAP_ByD_MassChange_SupplierGeneralData.xlsm is designed to serve this scenario.

    Create a user to access the ByD web services

    The Excel template in our example uses the ByD web services QuerySupplierIn and ManageSupplierIn to query, read and update ByD data. The logon user used in the Excel template must have authorizations for these ByD web services.

    Steps to create a user in ByD:

    1. Create a communication system representing the Excel template
      1. Open ByD work center Application and User Management , view Communication Systems
      2. Create a new communication system via button New
        1. Enter an ID, host name (any name… irrelevant for this scenario) and the System Access Type “Internet”
        2. Add a system instance via button Add Row and enter a System Instance ID and the Preferred Application Protocol 𔄝 – Web Service”
        3. Activate the communication system via button Actions >> set to Active
        4. Save and close the communication system

        1. Open ByD work center Application and User Management , view Communication Scenarios
        2. Create a new communication scenario via button New
          1. Enter a communication scenario name
          2. Press button Add Operations , filter by the service description “*Supplier*” and select the operations with service description “Check suppliers”, “Maintain suppliers” and “Find suppliers”
          3. Press button OK , save and close the communication scenario
          1. Open ByD work center Application and User Management , view Communication Arrangements
          2. Create a new communication arrangement via button New
            1. Select the communication scenario from step 2 and continue with button Next
            2. Select the communication system from step 1 and continue with button Next
            3. Select the authentication method “User ID and Password”, edit the credentials and continue with button Next
            4. Review your settings and complete the communication arrangement with button Finish

            If you have already a suitable ByD user and communication arrangement, then you can change the credentials via ByD communication arrangement:

            1. Open ByD work center Application and User Management , view Communication Arrangements
              1. Select and open the communication arrangement which includes the required ByD web services
              2. Click on button ViewAll
              3. Goto tab Technicalبيانات
              4. On section Inbound Communication: Basic Settings:
                1. Select the Authentication Method of your choice (e.g. user ID and password for logon)
                2. Edit the credentials via button Edit Credentials and change user/password or upload a client certificate.

                Query and Change ByD Supplier using the Excel Template

                Open the sample Excel template SAP_ByD_MassChange_SupplierGeneralData.xlsm.

                The Excel file consists of 5 pages:

                • _DATA_MASTER contains the ByD data. Using the menu buttons “Query”, the data is retrieved from the ByD system. If you change data in the relevant field(s), the corresponding records will be marked as modified. Using the menu buttons “Simulate” and “Update” the changed records will be sent back to the ByD system (for simulation resp. update as expected).
                • Query allows you to filter the data that is retrieved via button „Query“
                • Config holds important design time parameters. Most of the parameters are consisting of XML snippets.
                • Terms and Conditions contains information about the source and usage of the sample Excel template.

                1. Open Tab Query and enter suitable selection parameters
                2. Query and read ByD supplier via button “Query” of section “SAP ByD” (Excel quick access toolbar, tab Home) enter your ByD system and user/password on the logon popup (the Logon screen automatically pops up on the first query):
                3. Review the extracted supplier records on tab “_DATA_MASTER”

                Change Supplier ABC Classification and update Supplier in ByD:

                1. Change the ABC classifications in column E
                  Observe, that all touched suppliers get the status “Modified” in column B:
                2. Optional: Simulate the update of ByD supplier using button “Simulate” of section “SAP ByD” (Excel quick access toolbar, tab Home).
                  Observe: successfully checked lines are marked green, lines with errors are marked red and system messages are added as field comments in column B.
                3. Write back your changes to ByD using button “Update”.
                  If you simulated the update before, then Excel only sends lines to ByD that are marked “OK”.
                  If you did not simulate the update, then Excel sends all modified lines to ByD. In this case the complete update is rejected if one or more line are erroneous. Successfully updated lines are marked green, unprocessed lines or lines with errors are marked yellow or red and system messages are added as field comments.

                Press “Update” again to repeat the write back to ByD for the unprocessed lines w/o errors.

                On tab “ Config ” you can set the Test Mode = “ On ” to review web service requests and responses.

                Volume recommendations strongly depend on the business document and the data retrieved and updated per business document instance.

                As an example I recommend the following limits for ByD product data:

                • Query: The query process uses paging and can load high numbers of records. However, to avoid too long runtimes, I recommend to choose selection parameter values such that the total number of hits (e.g. material – sales organization – distribution channel combinations) does not become too high (< 10.000 records).
                • Update/Simulate: Assume all changed records are updated to ByD in a single web service call. To avoid timeouts, I recommend editing a limited number of records for each update/simulation run only (start with < 500 and check what is possible for your use case).

                The Excel template does not yet support value helps. Feel free to enhance the sample Excel helpful ByD web services are QueryCodeListIn and QueryObjectDescriptionIn (see as well How to get ByDesign Code Lists via Web Service QueryCodeListIn ) .


                What is a NULL value?

                Before we delve into how to navigate the potential minefield of datasets with missing values and avoid stepping on a Null, let’s first take a quick look at what a NULL is.

                Null (or NULL) is a special marker used in Structured Query Language to indicate that a data value does not exist in the database. Introduced by the creator of the relational database model, E. F. Codd, SQL Null serves to fulfil the requirement that all true relational database management systems (RDBMS) support a representation of “missing information and inapplicable information”. Codd also introduced the use of the lowercase Greek omega (ω) symbol to represent Null in database theory. In SQL, NULL is a reserved word used to identify this marker. … This should not be confused with a value of 0. A null value indicates a lack of a value — a lack of a value is not the same thing as a value of zero in the same way that a lack of an answer is not the same thing as an answer of “no”.

                SQL null is a state, not a value. This usage is quite different from most programming languages, where null value of a reference means it is not pointing to any object.

                SQL does provide some handy functionality for working with your character data in your SQL queries that we’ll describe in detail


                Here is a script that automatically converts input to upper case:

                From the spreadsheet, go Tools > Script Editor. Put the above code in the code window (replacing anything pre-filled there), and save.

                If you wanted to enforce upper case و single-character entries, then data validation could be used, with custom formula

                This is assuming the upper left corner of the range is A1, and that you expect letters of Latin alphabet. The regular expression ^[A-Z]$ means: beginning of string single character in the range A-Z end of string.


                3 Answers 3

                This is because you are in an after insert/update trigger and the records are read only in that context as they have been written, but not committed, to the database.

                Unfortunately your trigger is relying on the ids of the records, which means you won't be able to use before insert as the ids won't be populated at that time (as the records haven't been written to the database at that point so while you can write to them, database generated fields aren't populated).

                In this instance you'll need to clone the record (or query anew via SOQL) and make changes to the new copy of the record, then execute the update against the new copies.


                Request Validation

                If an API method has side effects and there is a need to validate the request without causing such side effects, the request message should contain a field:

                If this field is set to true , the server must not execute any side effects and only perform implementation-specific validation consistent with the full request.

                If validation succeeds, google.rpc.Code.OK يجب be returned and any full request using the same request message should not return google.rpc.Code.INVALID_ARGUMENT . Note that the request may still fail due to other errors such as google.rpc.Code.ALREADY_EXISTS or because of race conditions.


                5 Answers 5

                Other answers here are only working with the "known" meta keys, for custom/arbitrary meta keys, -map_metadata 0 is not sufficient to keep them all.

                In my transcoder project, a lot of camera makers like to inject custom meta keys in the MP4/MOV container, and I want to keep them in the transcoded MP4/MOV files. After a lot of head scratching, ffmpeg do have a switch for this purpose:

                Credit goes to the author of this thread and Google:

                The -metadata option is for manipulating the metadata. If you just want to copy the metadata from an input file to an ouput file, you should use the -map_metadata option:

                ffmpeg -i a.MOV -map_metadata 0 -c copy c.MOV

                The file specifier is a zero-indexed number, so '0' takes the metadata from the first input file.

                FFmpeg, by default, makes all metadata from the first input file متوفرة, to the output file muxer, for writing. -map_metadata allows to override that, by either pointing to a different input, or by telling ffmpeg to discard input global metadata (value of -1 ).

                However, which of the available metadata, is actually written to the output file, depends on the output muxer. The QT/ISOBMFF muxer (for MOV/MP4/3GP..) only considers a limited number of tags, primarily iTunes-related. As @JerryTian noted, with -movflags use_metadata_tags , all other tags are written to the file. However, these are written in an unconventional manner - Quicktime, in particular, does not recognize these additional metadata entries. Other, ffmpeg-based s/w, should read them. Or anyone who's using custom s/w, like @JerryTian, can adapt their s/w to read them.

                Note that movflags only applies to output from the QT muxer. Matroska (MKV) will write anything. Other muxers vary.


                Client-side form validation sometimes requires JavaScript if you want to customize styling and error messages, but it always requires you to think carefully about the user. Always remember to help your users correct the data they provide. To that end, be sure to:

                • Display explicit error messages.
                • Be permissive about the input format.
                • Point out exactly where the error occurs, especially on large forms.

                Once you have checked that the form is filled out correctly, the form can be submitted. We'll cover sending form data next.


                شاهد الفيديو: Power 1 series Thank you!