JavaRush /مدونة جافا /Random-AR /الجزء 2. هيكل نظام إدارة قواعد البيانات والجداول وأنواع ا...
Marat Sadykov
مستوى

الجزء 2. هيكل نظام إدارة قواعد البيانات والجداول وأنواع البيانات

نشرت في المجموعة
الجزء الاول
الجزء 2. هيكل نظام إدارة قواعد البيانات والجداول وأنواع البيانات - 1
نستمر في إنشاء محاكي البورصة البسيط الخاص بنا. إليك ما سنفعله:
  • لنقم بإنشاء مخطط تنظيمي لقاعدة البيانات.
  • سنصف ماذا وكيف وأين يتم تخزينه.
  • دعونا نتعرف على كيفية ارتباط البيانات ببعضها البعض.
  • لنبدأ في تعلم أساسيات SQL باستخدام مثال أمر إنشاء جدول SQL CREATE TABLE ، لغة تعريف البيانات ( DDL ) للغة SQL.
  • دعونا نواصل كتابة برنامج جافا. نحن ننفذ الوظائف الرئيسية لنظام إدارة قواعد البيانات (DBMS) فيما يتعلق بـ java.sql لإنشاء قاعدة البيانات الخاصة بنا برمجيًا، باستخدام JDBC وهندسة ثلاثية المستويات.
تبين أن هذين الجزأين أكثر ضخامة، لأننا نحتاج إلى التعرف على أساسيات SQL وتنظيم نظام إدارة قواعد البيانات (DBMS) من الداخل، وإجراء تشابهات مع Java. لكي لا تضجر من قوائم الأكواد، توجد في النهاية روابط لمستودع الالتزام github المقابل مع البرنامج.

تصميم نظم إدارة قواعد البيانات

وصف التطبيق

لقد سمعت بالفعل أن تنظيم تخزين البيانات جزء لا يتجزأ من البرمجة. اسمحوا لي أن أذكرك أن الغرض من تطبيقنا هو أبسط محاكاة للتبادل:
  • هناك أسهم يمكن أن تتغير قيمتها خلال يوم التداول وفقًا لقواعد معينة؛
  • هناك متداولون برأس مال أولي؛
  • يمكن للمتداولين شراء وبيع الأسهم وفقًا للخوارزمية الخاصة بهم.
تعمل البورصة بنظام القراد - فترات زمنية محددة (في حالتنا - دقيقة واحدة). خلال العلامة، قد يتغير سعر السهم، ومن ثم يمكن للمتداول شراء أو بيع الأسهم.

تبادل بنية البيانات المحاكاة

دعونا نسمي نماذج كيانات التبادل الفردية. ولتفادي أخطاء التقريب سنعمل بالمبالغ المالية من خلال فئة BigDecimal(التفاصيل تجدونها في الرابط في نهاية المقال). دعونا نصف هيكل كل نموذج بمزيد من التفاصيل :
يصف يكتب وصف
name سرتينج اسم
changeProbability كثافة العمليات احتمال تغير السعر كنسبة مئوية على كل علامة
startPrice BigDecimal التكلفة المبدئية
delta كثافة العمليات الحد الأقصى بالنسبة المئوية التي يمكن أن تتغير بها القيمة الحالية
شارك السعر:
يصف يكتب وصف
operDate LocalDateTime الوقت (علامة) لتحديد السعر
share ترقية رابط للترقية
rate BigDecimal شارك السعر
التاجر:
يصف يكتب وصف
name خيط الوقت (علامة) لتحديد السعر
sfreqTick كثافة العمليات تكرار المعاملات. يتم تحديدها حسب الفترة، بالقراد، وبعد ذلك يقوم المتداول بتنفيذ العمليات
cash BigDecimal مبلغ من المال بخلاف الأسهم
traidingMethod كثافة العمليات الخوارزمية المستخدمة من قبل التاجر. لنضعه كرقم ثابت، سيتم تنفيذ الخوارزمية (في الأجزاء التالية) في كود Java
changeProbability كثافة العمليات احتمال إتمام العملية، النسبة المئوية
about خيط احتمال تغير السعر، بالنسبة المئوية، على كل علامة
إجراءات التاجر:
يصف يكتب وصف
operation كثافة العمليات نوع المعاملة (شراء أو بيع)
traider تاجر رابط التاجر
shareRate شارك السعر ربط سعر السهم (على التوالي، السهم نفسه وسعره ووقت إصداره)
amount طويل عدد الأسهم المشاركة في الصفقة
ولضمان تفرد كل نموذج، سنضيف سمة idمن النوع long . ستكون هذه السمة فريدة ضمن مثيلات النموذج وستحددها بشكل فريد. يمكن للسمات التي تشير إلى نماذج أخرى (التاجر، السهم، سعر السهم) استخدام هذه السمة idلتحديد النموذج المقابل بشكل فريد. تتبادر إلى ذهني على الفور فكرة أنه يمكننا استخدامها Map<Long, Object> لتخزين مثل هذه البيانات، حيث Objectيوجد النموذج المقابل. ومع ذلك، حاول تنفيذ ذلك في التعليمات البرمجية وفقًا للشروط التالية:
  • حجم البيانات يتجاوز بشكل كبير مقدار ذاكرة الوصول العشوائي المتاحة؛
  • ومن المتوقع الوصول إلى البيانات من عشرات الأماكن المختلفة؛
  • مطلوب القدرة على تعديل وقراءة البيانات في وقت واحد؛
  • من الضروري ضمان قواعد تكوين البيانات وسلامتها؛
...وستواجه مهام تتطلب المؤهلات المناسبة والوقت المناسب للتنفيذ. ليست هناك حاجة إلى إعادة اختراع العجلة". لقد تم بالفعل التفكير في الكثير وكتابته لنا. لذلك سوف نستخدم ما تم اختباره بالفعل على مر السنين.

تخزين البيانات في جافا

دعونا نفكر في العمل. في Java، أنشأنا فئة محددة لهذا النموذج Shareمع الحقول name، changeProbabilityو startPrice، و delta. وتم تخزين العديد من المشاركات Map<Long, Share>حيث يكون المفتاح عبارة عن معرف فريد لكل مشاركة.
public class Share {
    private String name;
    private BigDecimal startPrice;
    private int changeProbability;
    private int delta;
}
Map<Long, Share> shares = new HashMap<>();
shares.put(1L, new Share("ibm", BigDecimal.valueOf(20.0), 15, 10));
shares.put(2L, new Share("apple", BigDecimal.valueOf(14.0), 25, 15));
shares.put(3L, new Share("google", BigDecimal.valueOf(12.0), 20, 8));
...
shares.put(50L, new Share("microsoft", BigDecimal.valueOf(17.5), 10,4 ));
للوصول إلى العرض الترويجي المطلوب عن طريق المعرف، استخدم الطريقة shares.get(id). بالنسبة لمهمة العثور على السهم بالاسم أو السعر، فإننا نقوم بتكرار جميع السجلات بحثًا عن السهم الذي نحتاجه، وهكذا. لكننا سنذهب في الاتجاه الآخر ونخزن القيم في نظام إدارة قواعد البيانات.

تخزين البيانات في نظام إدارة قواعد البيانات (DBMS).

دعونا نقوم بصياغة مجموعة أولية من قواعد تخزين البيانات لنظام إدارة قواعد البيانات:
  • يتم تنظيم البيانات في نظام إدارة قواعد البيانات (DBMS) في جداول ( TABLE )، وهي عبارة عن مجموعة من السجلات.
  • كافة السجلات لها نفس مجموعات الحقول. يتم ضبطها عند إنشاء الجدول.
  • يمكن تعيين الحقل إلى قيمة افتراضية ( افتراضية ).
  • بالنسبة للجدول، يمكنك تعيين القيود ( CONSTRAINT ) التي تصف متطلبات بياناته لضمان سلامتها. يمكن القيام بذلك في مرحلة إنشاء الجدول ( CREATE TABLE ) أو إضافته لاحقًا ( ALTER TABLE... ADD CONSTRAINT ).
  • القيد الأكثر شيوعا :
    • المفتاح الأساسي هو PRIMARY (المعرف في حالتنا).
    • حقل القيمة الفريدة UNIQUE (VIN لجدول المركبة).
    • التحقق من حقل التحقق (لا يمكن أن تكون قيمة النسبة المئوية أكبر من 100). أحد القيود الخاصة على الحقل ليس NULL أو NULL ، والذي يحظر/يسمح بتخزين NULL في حقل الجدول.
    • رابط إلى جدول طرف ثالث FOREIGN KEY (رابط إلى سهم في جدول أسعار السهم).
    • فهرس INDEX (فهرسة حقل لتسريع البحث عن القيم فيه).
    • لن يتم تعديل السجل ( INSERT , UPDATE ) إذا كانت قيم حقوله تتعارض مع القيود (CONSTRAINT).
  • يمكن أن يحتوي كل جدول على حقل مفتاح (أو عدة حقول) يمكن استخدامه لتعريف السجل بشكل فريد. يشكل هذا الحقل (أو الحقول، إذا كانت تشكل مفتاحًا مركبًا) المفتاح الأساسي للجدول - PRIMARY KEY .
    • يضمن المفتاح الأساسي تفرد السجل في الجدول، ويتم إنشاء فهرس عليه، مما يتيح الوصول السريع إلى السجل بأكمله بناءً على قيمة المفتاح.
    • وجود مفتاح أساسي يجعل من السهل إنشاء روابط بين الجداول. بعد ذلك، سوف نستخدم مفتاحًا أساسيًا صناعيًا: بالنسبة للسجل الأول id = 1، سيتم إدراج كل سجل لاحق في الجدول مع زيادة قيمة المعرف بمقدار واحد. يُطلق على هذا المفتاح غالبًا اسم AutoIncrement أو AutoIdentity .
في الواقع، جدول الأسهم: الجزء 2. هيكل نظام إدارة قواعد البيانات والجداول وأنواع البيانات - 2 هل من الممكن استخدام اسم السهم كمفتاح في هذه الحالة؟ بشكل عام - نعم، ولكن هناك احتمال أن تقوم بعض الشركات بإصدار أسهم مختلفة وتسميها باسمها فقط. في هذه الحالة، لن يكون هناك التفرد. في الممارسة العملية، يتم استخدام المفتاح الأساسي الاصطناعي في كثير من الأحيان. أوافق على أن استخدام الاسم الكامل كمفتاح فريد في جدول يحتوي على سجلات الأشخاص لن يضمن التفرد. وكذلك استخدام مزيج من الاسم الكامل وتاريخ الميلاد.

أنواع البيانات في نظام إدارة قواعد البيانات (DBMS).

مثل أي لغة برمجة أخرى، تحتوي SQL على كتابة البيانات. فيما يلي أنواع بيانات SQL الأكثر شيوعًا: أنواع الأعداد الصحيحة
نوع SQL مرادفات SQL المطابقة في جافا وصف
إنت INT4، عدد صحيح java.lang.Integer عدد صحيح 4 بايت، -2147483648... 2147483647
منطقية بول، بت java.lang.Boolean خطأ صحيح
تاينينت java.lang.Byte عدد صحيح 1 بايت، -128 … 127
سمالينت إنت2 java.lang.Short عدد صحيح 2 بايت، -32768 ... 32767
كبير إنت8 java.lang.Long عدد صحيح 8 بايت، -9223372036854775808... 9223372036854775807
زيادة تلقائية زيادة راتب java.lang.Long عداد تزايدي فريد للجدول. وإذا تم إدخال قيمة جديدة فيها يتم زيادتها بمقدار واحد، ولا تتكرر القيم الناتجة أبدًا.
حقيقي
نوع SQL مرادفات SQL المطابقة في جافا وصف
عشري (ن، م) ديسمبر، رقم java.math.BigDecimal دقة عشرية ثابتة (أرقام عددية N وأرقام كسرية M). مصممة بشكل أساسي للعمل مع البيانات المالية.
مزدوج تعويم8 java.lang.Double رقم حقيقي مزدوج الدقة (8 بايت).
حقيقي تعويم4 java.lang.Real رقم حقيقي ذو دقة واحدة (4 بايت).
خيط
نوع SQL مرادفات SQL المطابقة في جافا وصف
فارتشار(ن) نفارتشار java.lang.String سلسلة UNICODE ذات الطول N. الطول محدود بـ 2147483647 يقوم بتحميل محتويات السلسلة بالكامل إلى الذاكرة.
التاريخ و الوقت
نوع SQL مرادفات SQL المطابقة في جافا وصف
وقت java.time.LocalTime، java.sql.Time وقت التخزين (حتى نانو ثانية)، عند التحويل إلى DATETIME، يتم ضبط التاريخ على 1 يناير 1970.
تاريخ java.time.LocalDate، java.sql.Timestamp تخزين التواريخ بتنسيق yyyy-mm-dd، ويتم ضبط الوقت على 00:00
التاريخ والوقت الطابع الزمني java.time.LocalDateTime، java.sql.Timestamp تخزين التاريخ + الوقت (دون مراعاة المناطق الزمنية).
تخزين كميات كبيرة من البيانات
نوع SQL المطابقة في جافا وصف
سائل لزج java.io.InputStream، java.sql.Blob تخزين البيانات الثنائية (الصور والملفات...).
كلوب java.io.Reader، java.sql.Clob يؤدي تخزين البيانات النصية الكبيرة (الكتب والمقالات...)، على عكس VARCHAR، إلى تحميل البيانات في الذاكرة على أجزاء.

أسلوب الكتابة SQL

بالنسبة للعديد من اللغات، توجد إرشادات لتنسيق التعليمات البرمجية. عادةً ما تحتوي هذه المستندات على قواعد لتسمية المتغيرات والثوابت والأساليب وهياكل اللغة الأخرى. لذلك، بالنسبة لبيثون هناك PEP8، بالنسبة لـ Java - Oracle Code Conventions for Java . تم إنشاء عدة مجموعات مختلفة لـ SQL، والتي تختلف قليلاً عن بعضها البعض. بغض النظر، يجب عليك تطوير عادة اتباع القواعد عند تنسيق التعليمات البرمجية الخاصة بك، خاصة إذا كنت تعمل ضمن فريق. يمكن أن تكون القواعد، على سبيل المثال، ما يلي (بالطبع، يمكنك تطوير مجموعة مختلفة من القواعد لنفسك، والشيء الرئيسي هو الالتزام بها في المستقبل):
  • يجب كتابة الكلمات الرئيسية والكلمات المحجوزة، بما في ذلك الأوامر وعوامل التشغيل، بأحرف كبيرة: CREATE TABLE، CONSTRAINT...
  • يجب ألا تتطابق أسماء الجداول والحقول والكائنات الأخرى مع الكلمات الأساسية للغة SQL (انظر الرابط الموجود في نهاية المقالة)، ولكنها قد تحتوي عليها.
  • يجب أن تعكس أسماء الجداول الغرض منها. وهي مكتوبة بأحرف صغيرة. يتم فصل الكلمات الموجودة في الاسم عن بعضها البعض بواسطة الشرطة السفلية. الكلمة في النهاية يجب أن تكون بصيغة الجمع : التجار (التجار)، share_rates (سعر السهم).
  • يجب أن تعكس أسماء حقول الجدول الغرض منها. يجب أن تكون مكتوبة بأحرف صغيرة، ويجب تنسيق الكلمات الموجودة في الاسم بأسلوب Camel Case ، ويجب استخدام الكلمة في النهاية بصيغة المفرد : name (name)، share_rates (share Rate).
  • يجب أن تحتوي حقول المفتاح الاصطناعي على معرف الكلمة.
  • يجب أن تتبع أسماء CONSTRAINT اصطلاحات تسمية الجدول. يجب أن تتضمن أيضًا الحقول والجداول المتضمنة فيها، وتبدأ ببادئة دلالية: check_ (التحقق من قيمة الحقل)، pk_ (المفتاح الأساسي)، fk_ (المفتاح الخارجي)، uniq_ (تفرد الحقل)، idx_ (الفهرس). مثال: pk_traider_share_actions_id (المفتاح الأساسي في حقل المعرف لجدول trader_share_actions).
  • وهكذا، أثناء دراستك لـ SQL، سيتم تجديد/تغيير قائمة القواعد.

تصميم نظم إدارة قواعد البيانات

مباشرة قبل إنشاء نظام إدارة قواعد البيانات (DBMS)، يجب تصميمه. يحتوي المخطط النهائي على جداول ومجموعة من الحقول وCONSTRAINT ومفاتيح وشروط افتراضية للحقول والعلاقات بين الجداول وكيانات قاعدة البيانات الأخرى. يمكنك العثور على الإنترنت على العديد من المصممين المجانيين عبر الإنترنت/دون الاتصال بالإنترنت لتصميم أنظمة إدارة قواعد البيانات الصغيرة. حاول كتابة شيء مثل "مصمم قاعدة البيانات مجانًا" في محرك البحث. هذه التطبيقات لها خصائص إضافية مفيدة:
  • يمكن إنشاء أوامر SQL لإنشاء نظام إدارة قواعد البيانات (DBMS).
  • عرض الإعدادات بشكل مرئي على الرسم التخطيطي.
  • يسمح لك بتحريك الجداول لرؤية أفضل.
  • إظهار المفاتيح والفهارس والعلاقات والقيم الافتراضية وما شابه ذلك على الرسم التخطيطي.
  • يمكنهم تخزين مخطط DBMS عن بعد.
على سبيل المثال، يقوم dbdiffo.com بتمييز المفاتيح وإظهار الحقول غير الفارغة وعدادات AI (AutoIncrement) ذات التسمية NN:
الجزء 2. هيكل نظام إدارة قواعد البيانات والجداول وأنواع البيانات - 3

إنشاء الجداول في نظام إدارة قواعد البيانات (DBMS).

لذلك لدينا رسم تخطيطي. الآن دعنا ننتقل إلى إنشاء الجداول (إنشاء جدول). للقيام بذلك، من المستحسن أن يكون لدينا بيانات أولية:
  • اسم الطاولة
  • أسماء الحقول ونوعها
  • القيود (القيود) على الحقول
  • القيم الافتراضية للحقول (إن وجدت)
  • المفتاح الأساسي (PRIMARY KEY) إن وجد
  • الاتصالات بين الجداول (المفتاح الخارجي)
لن ندرس بالتفصيل جميع خيارات أمر CREATE TABLE، بل سنلقي نظرة على أساسيات SQL باستخدام مثال إنشاء جدول للمتداولين:
CREATE TABLE traiders(
	id BIGINT AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR(255) NOT NULL,
	freqTiсk INTEGER NOT NULL,
	cash  DECIMAL(15,2) NOT NULL DEFAULT 1000,
	tradingMethod INTEGER NOT NULL,
	changeProbability INTEGER NOT NULL DEFAULT 50,
	about VARCHAR(255) NULL
);
ALTER TABLE traiders ADD CONSTRAINT check_traiders_tradingMethod
	CHECK(tradingMethod IN (1,2,3));
ALTER TABLE traiders ADD CONSTRAINT check_traiders_changeProbability
	CHECK(changeProbability <= 100 AND changeProbability > 0)
دعونا نلقي نظرة فاحصة:
  • CREATE TABLE traiders(وصف الحقل) - يقوم بإنشاء جدول بالاسم المحدد، ويتم فصل الحقول في الوصف بفاصلة. أي أمر ينتهي بفاصلة منقوطة.
  • يبدأ وصف الحقل باسمه، متبوعًا بنوعه وCONSTRAINT والقيمة الافتراضية.
  • id BIGINT AUTO_INCREMENT PRIMARY KEY- حقل المعرف من النوع الصحيح هو مفتاح أساسي وعداد تزايدي (لكل سجل جديد لحقل المعرف، سيتم إنشاء قيمة أكبر من تلك التي تم إنشاؤها مسبقًا لهذا الجدول).
  • cash DECIMAL(15,2) NOT NULL DEFAULT 1000– حقل النقد، العلامة العشرية، 15 رقمًا قبل العلامة العشرية واثنين بعد (البيانات المالية، على سبيل المثال، الدولار والسنت). لا يمكن قبول القيم الخالية. إذا لم يتم إعطاء أي قيمة، فسوف تحصل على القيمة 1000.
  • about VARCHAR(255) NULL- الحقل "حول"، وهو عبارة عن سلسلة يصل طولها إلى 255 حرفًا، يمكنها قبول القيم الفارغة.
لاحظ أنه يمكننا تعيين جزء من شروط CONSTRAINT بعد إنشاء الجدول. لنفكر في إنشاء تعديل بنية الجدول وحقوله: ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK (condition) باستخدام الأمثلة:
  • CHECK(tradingMethod IN (1,2,3))- يمكن لحقل TradingMethod أن يأخذ القيم 1،2،3 فقط
  • CHECK(changeProbability <= 100 AND changeProbability > 0)– يمكن أن يأخذ حقل ChangeProbability قيمًا صحيحة في النطاق من 1 إلى 100

العلاقات بين الجداول

لتحليل وصف العلاقات بين الجداول، دعونا نلقي نظرة على إنشاء أسعار المشاركة:
CREATE TABLE share_rates(
	id BIGINT AUTO_INCREMENT PRIMARY KEY,
	operDate datetime NOT NULL,
	share BIGINT NOT NULL,
	rate DECIMAL(15,2) NOT NULL
);
ALTER TABLE share_rates ADD FOREIGN KEY (share) REFERENCES shares(id)
الجزء 2. هيكل نظام إدارة قواعد البيانات والجداول وأنواع البيانات - 4
يمكن تعيين رابط لقيم جدول آخر على النحو التالي: ALTER TABLEtable_from_what_is_referred ADD FOREIGN KEY(field_what_referred) REFERENCEStable_to_what_is_referenced (field_what_is_referenced) دع الأسهم لدينا سجلات على الأسهم، على سبيل المثال، للمعرف = 50 نقوم بتخزين أسهم Microsoft بسعر أولي قدره 17.5 ، دلتا 20 وفرصة التغيير 4٪. بالنسبة لجدول share_rates نحصل على ثلاث خصائص رئيسية:
  • نحتاج فقط إلى تخزين قيمة مفتاح المعرف من جدول المشاركات في حقل المشاركة لاستخدامه للحصول على المعلومات المتبقية (الاسم، وما إلى ذلك) من جدول المشاركات.
  • لا يمكننا إنشاء سعر لعرض ترويجي غير موجود. لا يمكنك إدراج قيمة غير موجودة في حقل المشاركة (الذي لا يوجد له سجل في جدول المشاركات بهذا المعرف)، لأنه لن يكون هناك أي مراسلات بين الجداول.
  • لا يمكننا حذف إدخال مشاركة في الأسهم التي تم تحديد أسعارها في أسعار_المشاركة.
تعمل النقطتان الأخيرتان على ضمان سلامة البيانات المخزنة. يمكنك مشاهدة إنشاء جداول SQL لمضاهاتنا وأمثلة لاستعلامات SQL في تنفيذ Java لطرق الفئات المقابلة باستخدام الرابط إلى مستودع github في نهاية المقالة. الجزء الثالث
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION