البرنامج التعليمي الأساسي لـ SQL - كيفية تحديد مفتاح أساسي في قاعدة البيانات

تبدأ كل قصة رائعة بأزمة هوية. يبدأ Luke ، سيد Jedi العظيم ، غير متأكد - "من أنا؟" - وكيف يمكنني أن أكون أي شخص مهم؟ يتطلب الأمر من يودا ، صاحب القوة ، أن يعلمه كيفية تسخير قواه.

اليوم ، دعني أكون Yoda الخاص بك.

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

كيفية اختيار مفتاح أساسي

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

تخيل أنك الحكومة ، وتريد تحديد كل واحد من مواطنيك رقميًا. لذلك ، تقوم بإنشاء قاعدة البيانات هذه بكل ما يتعلق بها:

First Name Last Name Passport Number

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

ثم بعد بضع سنوات ، تكتشف حقيقة قبيحة: البلد بأكمله يواجه أزمة هوية.

عندما تنتهي صلاحية جواز سفر شخص ما ، يحصل على جواز جديد. تتغير هويتهم. تستمر الأنظمة الأخرى في استخدام أرقام جوازات السفر القديمة ، لذا فهي تشير الآن إلى الأشخاص الوهميين.

التفرد لا يكفي. يجب ألا تتغير القيمة طوال عمر الصف.

وبعد ذلك ، تجد أن هناك بعض الأشخاص الذين ليس لديهم حتى جوازات سفر. لا يمكنك إدخالها في نظامك ، لأن المفاتيح الأساسية لا يمكن أن تكون كذلك NULL. كيف يمكنك التعرف على شخص ما NULLبمفتاح؟

يجب أن يكون لكل صف معرف. غير مسموح بالقيم الفارغة.

يعني التكرار التالي العثور على معرّف لا يتغير بمرور الوقت ، ومعرّف يمتلكه الجميع. في الهند ، تبين أن هذه هي بطاقة أذار. في الولايات المتحدة ، رقم الضمان الاجتماعي.

إذا كنت تقوم بإنشاء قاعدة بيانات ، فاجعلها مفاتيحك الأساسية.

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

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

userID First Name Last Name Passport Number

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

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

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

الخلاصة الرئيسية هي: عندما تختار مفتاحًا أساسيًا ، فكر في أزمة هوية . هل من الممكن أن يقوم شخص ما بتغيير معرفه في المستقبل؟ هل يمكننا الدخول في حالة بها عدة أشخاص لديهم نفس المعرف؟

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

ملاحظة: في بعض الأحيان ، من الممكن ، ومن المرغوب فيه استخدام أعمدة متعددة معًا كمفتاح أساسي. هذا مفتاح مركب.

الآن دعنا نحاول تعريف المفاتيح الأساسية بأمثلة الكود الحقيقي. هناك شيئين يجب القيام بهما هنا: أولاً ، ستحدد المفتاح الأساسي. بعد ذلك ، ستتعلم بناء الجملة لتعريفه في قاعدة بيانات.

مثال من العالم الحقيقي

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

أنت ترى أنك ستحتاج إلى جدول واحد للعملاء ، وجدول للحزم ، وواحد للنقل ، يوضح الحزمة الموجودة في مكانها الآن.

فكر في الأعمدة التي ستحتاج إليها ، وما يجب أن يكون المفتاح الأساسي. إذا كنت مهندسًا في Flexport ، فهذا سؤال فعلي يجب عليك معرفته. لم يتم إعطاء أي شيء ، كل شيء تم اكتشافه في العالم الحقيقي.

بالنظر إلى هذه المعلومات ، سأصمم هذه الجداول على النحو التالي:

Customers: first_name, last_name, email, address (for deliveries to their location) Packages: weight, content Transportation: , Port, time

نحن نفتقد المفاتيح الأساسية. فكر فيهم قبل قراءة المزيد.

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

لذلك ، من المنطقي إنشاء رقم عشوائي واستخدامه كمعرف. هذا هو السبب في أنك ترى FedEx و UPS وكل خدمة توصيل تستخدم الرموز الشريطية والمعرفات. هذه مفاتيح بديلة تم إنشاؤها لتتبع الحزم.

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

قصة ممتعة: أعرف عددًا قليلاً من الشركات التي كشفوا فيها عن رقم العميل هذا ، وأصر العملاء على أنهم حصلوا على رقم 1. كان الأمر مضحكًا للغاية - كان على المهندسين تغيير كود الواجهة الأمامية إلى: if (cust == 345681) print(1);

بالنسبة للنقل ، سأختار PackageID المركب + Port + time. هذا أكثر إثارة بعض الشيء. كان بإمكاني إنشاء بديل هنا أيضًا ، وسيعمل أيضًا.

لكن هنا يكمن سحر الفهرسة. تحصل المفاتيح الأساسية على فهرس تلقائيًا ، مما يعني أن البحث أكثر كفاءة من المفاتيح الأساسية.

عندما تبحث في قاعدة البيانات هذه ، ستكون معظم الاستفسارات من النموذج "أين هذه الحزمة؟". بعبارة أخرى ، بالنظر إلى PackageID هذا ، أخبرني عن المنفذ والوقت في الوقت الحالي. سأحتاج إلى فهرس إضافي عبر PackageID إذا لم يكن لديّ كجزء من المفتاح الأساسي الخاص بي.

هل هذا يبدو جيدا؟ الخطوة الأخيرة ، دعنا نحدد هذه الجداول الثلاثة في SQL. يختلف بناء الجملة قليلاً مع قاعدة البيانات التي تستخدمها.

تحديد المفاتيح الأساسية في MySQL

CREATE TABLE customers ( customerID INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, last_name VARCHAR(30) NOT NULL, first_name VARCHAR(25) NOT NULL, email VARCHAR(50) NOT NULL, address VARCHAR(300) );
CREATE TABLE packages ( packageID INT(15) NOT NULL AUTO_INCREMENT, weight DECIMAL (10, 2) NOT NULL, content VARCHAR(50), CONSTRAINT packages_pk PRIMARY KEY (packageID) # An alternative way to above, # when you want to name the constraint as well. );
CREATE TABLE transportation ( package INT(15) NOT NULL, port INT(15) NOT NULL, time DATE NOT NULL, PRIMARY KEY (package, port, time), FOREIGN KEY package REFERENCES packages(packageID) ON DELETE RESTRICT # It's good practice to define what should happen on deletion. In this case, I don't want things to get deleted. );

تحديد المفاتيح الأساسية في PostgreSQL

CREATE TABLE customers ( customerID SERIAL NOT NULL PRIMARY KEY, # In PostgreSQL SERIAL is same as AUTO_INCREMENT - it adds 1 to every new row. last_name VARCHAR(30) NOT NULL, first_name VARCHAR(25) NOT NULL, address TEXT, email VARCHAR(50) NOT NULL );
CREATE TABLE packages ( packageID SERIAL NOT NULL, weight NUMERIC NOT NULL, content TEXT, CONSTRAINT packages_pk PRIMARY KEY (packageID) # In PostgreSQL, this alternative way works too. );
CREATE TABLE transportation ( package INTEGER NOT NULL, port INT(15) NOT NULL, time DATE NOT NULL, PRIMARY KEY (package, port, time), FOREIGN KEY package REFERENCES packages(packageID) ON DELETE RESTRICT # It's good practice to define what should happen on deletion. In this case, I don't want things to get deleted. );

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

حظا سعيدا ، بادوان الشاب.

استمتعت بهذا؟ قد تعجبك أيضًا أشياء تعلمتها من مهندس برمجيات كبير