البرنامج التعليمي الأساسي لـ 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. );
الأمر ليس مختلفًا تمامًا ، أليس كذلك؟ بمجرد الانتهاء من الأساسيات ، يمكنك تطبيقها على أي قاعدة بيانات تقريبًا بمجرد إلقاء نظرة سريعة على الوثائق. المفتاح هو معرفة ما الذي تبحث عنه!
حظا سعيدا ، بادوان الشاب.
استمتعت بهذا؟ قد تعجبك أيضًا أشياء تعلمتها من مهندس برمجيات كبير