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

تم تصميم قواعد بيانات NoSQL (غير الارتباطية) لضمان السرعة والحجم - وليس المرونة. ورغم أن أداء قاعدة بياناتك الارتباطية قد يتراجع مع توسع النطاق، إلا أن قواعد البيانات المتوسعة أفقيًا مثل DynamoDB ستوفر أداء ثابتًا على أي نطاق. يمتلك بعض مستخدمي DynamoDB جداول بحجم أكبر من 100 تيرابايت، ويُعد أداء القراءة والكتابة لجداولهم هو نفسه عندما كانت الجداول أقل من 1 جيجابايت في الحجم.

يتطلب تحقيق أفضل النتائج باستخدام قاعدة بيانات NoSQL مثل DynamoDB تحولًا في التفكير من قاعدة البيانات الارتباطية النموذجية. استخدم أفضل الممارسات التالية عند نمذجة البيانات باستخدام DynamoDB.

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

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

في DynamoDB، تفكر في أنماط الوصول قبل نمذجة جدولك. بينما تركز قواعد بيانات NoSQL على السرعة، وليس المرونة. فأنت تسأل أولاً عن كيفية وصولك إلى بياناتك، ثم تقوم بنمذجتها في الشكل الذي سيتم الوصول إليه.

قبل تصميم جدول DynamoDB، قم بتوثيق كل ما تحتاجه لقراءة البيانات وكتابتها في تطبيقك. كن دقيقًا وفكر في جميع التدفقات في تطبيقك لأنك ستقوم بتحسين جدولك لأنماط وصولك.

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

ولتحسين عدد الطلبات المقدمة إلى DynamoDB، سوف تحتاج إلى فهم بعض المفاهيم الأساسية:

المفاتيح الأساسية
الفهارس الثانوية
المعاملات

3. لا تصنع نموذجًا ارتباطيًا
غالبًا ما يحاول الأشخاص الجدد في DynamoDB تطبيق نموذج ارتباطي أعلى DynamoDB غير الارتباطي. إذا حاولت القيام بذلك، فستفقد معظم فوائد DynamoDB.

تتمثل الأنماط المضادة الأكثر شيوعًا (الاستجابات غير الفعالة للمشاكل المتكررة) التي يجربها الناس مع DynamoDB فيما يلي:

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

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

الوقت اللازم لاستكمال الوحدة: 20 دقيقة


  • الخطوة 1: بناء مخطط الكيان-العلاقة

    تتمثل الخطوة الأولى لأي تمرين لنمذجة البيانات في إنشاء مخطط لإظهار الكيانات في تطبيقك وكيفية ارتباطها ببعضها البعض.

    في تطبيقنا هذا، لدينا الكيانات التالية:
    • المستخدم
    • اللعبة
    • UserGameMapping

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

    وفي النهاية، تحتوي اللعبةعلى مستخدمين متعددين ويستطيع المستخدم اللعب في ألعاب متعددة مختلفة. وبهذا، تكون هناك علاقة متعدد إلى متعدد بين المستخدمين والألعاب. يمكننا تمثيل هذه العلاقة باستخدام كيان UserGameMapping.

    مع وضع هذه الكيانات والعلاقات في الاعتبار، يتم عرض مخطط الكيان-العلاقة أدناه.

    (انقر للتكبير)

  • الخطوة 2: النظر في أنماط الوصول لملف تعريف المستخدم

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

    عندما يلعب المستخدم ألعابًا، يتم تحديث إحصائيات اللعبة لتعكس عدد الألعاب التي لعبها المستخدم وعدد الألعاب التي فاز فيها وعدد عمليات القتل التي قام بها.

    وبناءً على هذه المعلومات، تكون لدينا ثلاثة أنماط وصول:

    •  إنشاء ملف تعريف المستخدم (كتابة)
    •  تحديث ملف تعريف المستخدم (كتابة)
    • الحصول على ملف تعريف المستخدم (قراءة)
  • الخطوة 3: النظر في أنماط الوصول قبل اللعبة

    إن لعبتنا هي عبارة عن لعبة لمعركة ملكية. يمكن للاعبين إنشاء لعبة على خريطة معيّنة، ويمكن للاعبين آخرين الانضمام إلى اللعبة. تبدأ اللعبة عند انضمام 50 لاعبًا إلى اللعبة، ولا يمكن لأي لاعب آخر إضافي الانضمام إليها.

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

    وبناءً على هذه المعلومات، تكون لدينا أنماط الوصول السبعة التالية:

    • إنشاء لعبة (كتابة)
    • البحث عن الألعاب المفتوحة (قراءة)
    • البحث عن الألعاب المفتوحة حسب الخريطة (قراءة)
    • عرض لعبة (قراءة)
    • عرض المستخدمين في اللعبة (قراءة)
    • انضمام مستخدم إلى لعبة (كتابة)
    • بدء اللعبة (كتابة)
  • الخطوة 4: أنماط الوصول في اللعبة وما بعد اللعبة

    وأخيرًا، فلننظر في أنماط الوصول أثناء اللعبة وبعدها.

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

    فيما بعد، قد يرغب اللاعبون في مراجعة الألعاب السابقة التي لعبوها أو التي لعبها لاعبون آخرون.

    وبناءً على هذه المعلومات، تكون لدينا ثلاثة أنماط وصول:

    • تحديث لعبة لمستخدم (كتابة)
    • تحديث لعبة (كتابة)
    • البحث عن جميع الألعاب السابقة للمستخدم (قراءة)

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

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