كيف يمكنك تمثيل كيان علائقية كوحدة واحدة من البيانات المسترجع في Berkeleydb؟

StackOverflow https://stackoverflow.com/questions/992173

سؤال

berkeleydb. هل قاعدة البيانات المكافئة ل Ruby Hashtable أو قاموس Python باستثناء أنه يمكنك تخزين قيم متعددة لمفتاح واحد.

سؤالي هو: إذا أردت تخزين نوع بيانات معقدة في بنية تخزين مثل هذا، كيف يمكنك الذهاب حول هذا الموضوع؟

في جدول العلائقية العادية، إذا كنت ترغب في تمثيل شخص ما، يمكنك إنشاء جدول مع أعمدة من أنواع البيانات معينة:

Person
-id:integer
-name:string
-age:integer
-gender:string

عندما تكون مكتوبا مثل هذا، يمكنك معرفة كيفية فهم شخص كمجموعة من أزواج المفتاح / القيمة:

id=1
name="john"; 
age=18; 
gender="male";

تتحلل الشخص في أزواج المفتاح الفردي / القيمة (الاسم = "John") سهل.

ولكن من أجل استخدام تنسيق Berkeleydb لتمثيل شخص ما، ستحتاج إلى بعض الطرق لإعادة صياغة الشخص من أزواج المفتاح / القيمة المكونة.

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

هل هناك طريقة للقيام بذلك؟

تحرير: كما تشير إجابة روبرت هارفي، هناك ميزة ثبات الكيانات في طبعة جافا من berkeleydb. لسوء الحظ لأنني سأكون متنااصل إلى Berkeleydb من تطبيق Ruby باستخدام مونيتا, ، سوف أستخدم الطبعة القياسية التي أعتقد أنها تتطلب مني إنشاء حل مخصص في غياب هذا الدعم.

هل كانت مفيدة؟

المحلول

يمكنك دائما تسلسل (يسمى Marshalling في Ruby) البيانات كسلسلة وتخزينها بدلا من ذلك. يمكن القيام بالتسليط بعدة طرق.

مع YAML (ميزة: مقروءة بشرية، تنفيذ متعدد بلغات مختلفة):

require 'yaml'; str = person.to_yaml

مع التنشيط (روبي فقط، حتى نسخة روبي خاصة):

Marshal.dump(person)

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

نصائح أخرى

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

على سبيل المثال:

Person
 -id:1
 -name:"john"
 -age:18
 -gender:"male"

كنت أخزن تمثيل YAML في Berkleydb مع المفتاح person_1:

--- !ruby/object:Person 
attributes: 
  id: 1
  name: john
  age: 18
  gender: male

بدلا من ذلك، إذا كنت بحاجة إلى تخزين كل سمة كمفتاح في DataStore (لماذا؟)، يجب عليك التأكد من أن مفتاح سجل الشخص مرتبط بسمة تحديده إلى حد ما، وهذا هو المعرف الخاص ب Activerecord.

في هذه الحالة، يمكنك تخزين هذه المفاتيح في Berkleydb:

person_1_name="john"; 
person_1_age=18; 
person_1_gender="male";

إلقاء نظرة على هذه الوثائق للحصول على كيان نوع التوضيحية:

http://www.oracle.com/technology/documentation/berkeley-db/je/java/com/sleepycat/persist/model/entity.html.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top