Featured image of post تخزين العملة في قواعد البيانات: هل يجب عليك استخدام DECIMAL أم BIGINT؟

تخزين العملة في قواعد البيانات: هل يجب عليك استخدام DECIMAL أم BIGINT؟

عند تطوير نظام دفع، ما هو نوع الحقل الذي يجب أن تستخدمه للعملة؟ تشرح هذه المقالة لماذا يجب ألا تستخدم FLOAT على الإطلاق، وكيف تختار بين DECIMAL و BIGINT لإنشاء نظام تخزين عملة عالي الأداء وخالٍ من الأخطاء.

عند تطوير أنظمة الدفع أو التجارة الإلكترونية، هل فكرت يومًا في استخدام FLOAT أو DOUBLE من أجل حقول المبالغ في قاعدة البيانات؟

إذا كان الأمر كذلك، فتوقف الآن! قد يكون نظامك يسرب الأموال سرًا.

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

إذن، ما الذي يجب أن نستخدمه بالضبط لتخزين الأموال؟

لماذا يعتبر FLOAT سامًا للأنظمة المالية؟

في عالم الكمبيوتر، تُمثَّل الأرقام بالنظام الثنائي. FLOAT (أرقام الفاصلة العائمة)، عند تمثيل كسور عشرية معينة، هو في الواقع “تقريب”. يشبه الأمر محاولة تقطيع كعكة رقيقة بمنشار خشن؛ بغض النظر عن مدى حذرك، سوف تسقط بعض الفتات دائمًا من الحواف.

المثال الكلاسيكي هو: 0.1 + 0.2 غالبًا لا يساوي 0.3 في الكمبيوتر. إذا كنت تعالج ملايين المعاملات، فإن هذه الأخطاء متناهية الصغر من “0.00000000000000004” سوف تتراكم، ولن تتوازن دفاتر الأستاذ أبدًا. تذكر:

عندما يتعلق الأمر بالمال، فإن أي “تقريب” هو كارثة.

دفتر الأستاذ الدقيق للمحاسب: مزايا DECIMAL

إذا كنت تريد حلاً دقيقًا حيث “ما تراه هو ما تحصل عليه”، فإن DECIMAL هو رقم النقطة الثابتة الأصلي لقاعدة البيانات والمعيار الصناعي.

يشبه DECIMAL دفتر الأستاذ الرائع في أيدي المحاسب؛ فهو يفصل بدقة الأرقام الصحيحة والكسور العشرية، مما يضمن أن 0.1 + 0.2 يساوي مطلقًا 0.3.

النسبة الذهبية للصناعة: DECIMAL(19, 4)

نوصي بشكل عام باستخدام DECIMAL(19, 4):

  • 19: يمثل سعة إجمالية قدرها 19 رقمًا (الدقة).
  • 4: يشير إلى الاحتفاظ بـ 4 أرقام بعد العلامة العشرية.

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

هذه السعة كبيرة بما يكفي لدرجة تمكنك من شراء إجمالي الناتج المحلي لعدة كواكب تشبه الأرض!

هل هذا كافٍ للسيناريوهات المالية في العالم الحقيقي؟

إذا أخذنا DECIMAL(19, 4) كمثال:

  • الأرقام الصحيحة: 15 رقمًا
  • الحد الأقصى للمبلغ: 999,999,999,999,999
  • التحويل إلى الدولار الأمريكي: تقريبًا. 999 تريليون دولار أمريكي
المرجع المبلغ
الناتج المحلي الإجمالي للولايات المتحدة يقارب 27 تريليون دولار
إجمالي الناتج المحلي العالمي يقارب 105 تريليون دولار
إجمالي الثروة العالمية يقارب 454 تريليون دولار

يمكن أن يستوعب DECIMAL(19, 4) أرقامًا تتجاوز إجمالي الثروة العالمية بكثير، مما يجعله كافيًا تمامًا للغالبية العظمى من الأنظمة المالية.

أقصى حدود دقة مدعومة للـ DECIMAL من قبل قواعد البيانات الرئيسية

قاعدة البيانات الحد الأقصى للدقة
MySQL / MariaDB 65
PostgreSQL 131072 (أرقام صحيحة) + 16383 (أرقام عشرية)
SQL Server 38
Oracle 38

آلة عملات الألعاب (الأركيد): طريقة الوحدة الأصغر BIGINT

إذا كنت تسعى للحصول على الأداء المطلق، أو إذا كانت لنظامك متطلبات تزامن عالية للغاية مثل Stripe أو Alipay، فقد يكون BIGINT (طريقة تخزين الأعداد الصحيحة) هو خيارك الأفضل.

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

  • 100.50 دولار أمريكي ← تم تخزينه كـ 10050 (سنت)
  • 100 دولار تايواني جديد ← تم تخزينه كـ 100 (دولار)

لماذا تختار BIGINT؟

السبب الوصف
سرعة فائقة يُعد الجمع والطرح للأعداد الصحيحة أحد تخصصات وحدة المعالجة المركزية (CPU)؛ وعادةً ما يكون الأداء الحسابي أسرع بكثير من DECIMAL.
كفاءة المساحة تخصيص ثابت بحجم 8 بايت، وهو مناسب للغاية لقواعد البيانات الكبيرة جدًا.

مع ذلك، يتمثل العيب في ضعف القابلية للقراءة. عندما تفتح قاعدة البيانات وترى 10050، يجب عليك قسمتها تلقائيًا على 100 في رأسك (أو في الكود الخاص بك).

المواجهة النهائية: كيف تختار؟

لتقرير أيهما تستخدم، يمكننا أن نأخذ بعين الاعتبار “تكرار الاستعلام” و “حجم النظام”:

بُعد المقارنة DECIMAL BIGINT
قابلية القراءة ممتازة (قراءة الأرقام مباشرة) أضعف (يتطلب تحويلًا يدويًا)
السرعة الحسابية عادية سريعة جدًا
الالسيناريوهات القابلة للتطبيق تخطيط موارد المؤسسات (ERP)، النظم المالية الداخلية، التجارة الإلكترونية العامة التداول عالي التردد، الخدمات الصغيرة الكبيرة للغاية، واجهات برمجة التطبيقات (APIs) على غرار Stripe

توصيات عملية

السيناريو القابل للتطبيق الحقل الموصى به
التجارة الإلكترونية العامة، وأنظمة إعداد التقارير الداخلية للشركات، حيث يحتاج المحاسبون إلى تنفيذ SQL مباشرة لإجراء عمليات التدقيق DECIMAL(19, 4)
أنظمة التداول عالية التردد، أو متطلبات قابلية التوسع القصوى BIGINT

ملخص

باختصار، بغض النظر عن الخيار الذي تختاره، يُمنع منعًا باتًا ودائمًا استخدام FLOAT لتخزين الأموال! يضمن اختيار نوع الحقل الصحيح أن يظل نظامك قويًا ومتينًا في الحسابات المالية.

All rights reserved,未經允許不得隨意轉載
مبني بستخدام Hugo
قالب Stack مصمم من Jimmy