اذهب إلى المحتوى
  • 0

هل يمكن الاستغناء عن المفتاح الاجنبي في هذه الحالة ؟

صالح السوفي

السؤال

فرضا لو انه لدينا 3 جداول :
جدول المستخدم فيه معلوماته بالاضافة للدولة و المدينة (حددت حقل الدولة كمفتاح اجنبي لجدول الدولة  )
جدول  الدولة فيه رقم الدولة و اسمها
جدول المدينة فيه رقم المدينة  و اسمها  ورقم الدولة التابعه لها  (حددت حقل رقم الدولة كمفتاح اجنبي لجدول الدولة  )

السؤال عند تسجيل مستخدم جديد  كيف اضع شرط في ال SQL  لكي  لا يدخل مدينة غير تابعة لدولته ام انه هنا علي العمل من خلال لغة البرمجة

 

تم التعديل في بواسطة صالح السوفي
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

السلام عليكم, هذا كود بلغة PHP و JQuery يوضح لك طريقة عملها.
يفضل دائماً حماية الكود البرمجي من جهة الفرونت إند وكذلك الباك إند, حيث عند عمل النماذج وتحديد الدولة وعمل كود JQuery لإظهار المدن حسب الدولة المحددة.  قد نعتقد ان هذا الامر كافي, لكن بصراحة قد يتم التلاعب من بعض المستخدمين, وهذا أمر وارد.
لذا يفضل أيضاً التأكد من طرف الباك إند, قد يبدو الأمر مرهق خاصة في الأنظمة الكبيرة, لكن أنا شخصياً اقوم بإعتماد رقم المدينة المدخل من طرف المستخدم, إنما رقم الدولة وإن كان مدخل أيضاً من النموذج, لا أتعامل معه.
إبحث عن رقم الدولة من جدول المدينة وبالتالي يكون الضمان بأن جميع البيانات المدخلة صحيحة.

كذلك عند تعيين بعض الحقول بأنها مطلوب ولا يمكن أن تكون قيمتها null, بعض المبرمجين يقوم فقط بتعيين مربع النص بإنه Required, لكن هذا أيضاً غير كاف, يجب إستخدام Validation من طرف الباك إند قبل عملية التخزين أو التعديل على قواعد البيانات.

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

<select class="full-width country" id="person_country_id" required name="person_country_id" data-init-plugin="select2">
   <option value=""></option>
    @foreach($countries as $one)
    	<option value="{{@$one->country_id}}">{{@$one->country->name}}</option>
    @endforeach
  </optgroup>
</select>

<select class="full-width city" id="person_city_id" required name="person_city_id" data-init-plugin="select2">
</select>


<script>
    $(document).ready(function(){
        $(document).on('change','.country',function(e){
        var country_id = $(this).val();
        var url = "{{ url(app()->getLocale().'/getCities/') }}";
    
          if(country_id){
            $.ajax({
              type: "GET",
              url: url+'/'+country_id,
              success: function (response) {
                  if(response)
                  {
                    $(".city").empty();
                    $(".city").append('<optgroup label="{{__('website.choose_city')}}">');
                    $.each(response, function(index, value){
                      $(".city").append('<option value="'+value.id+'">'+ value.name +'</option>');
                      $(".city").append('</optgroup>');
                    });
                  }
              }
            });
          }
          else{
            $(".city").empty();
          }
    });

)};
</script>




 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

أهلا بك @صالح السوفي

يمكنك عمل ذلك من خلال ال cient side اي من واجهة التسجيل ,من خلال إستخدام جيكويري مثلا عند اختيار الزائر دولة معينة يتم إظهار المدن الخاصة بتلك الدول فقط ومن ثم أخذ ال id للمدينة التي تم اختيارها وارسالها الى السيرفر  ,أو حل أخر من خلال التاكد من id المدينة هل يطابق ال id المرتبط بالدولة ,وهكذا

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

مرحباً بك،

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

 

يمكنك أن تجعل في جدول المستخدمين مفتاح خارجي فقط للمدينة، وفي جدول المدينة أن يكون هناك مفتاح خارجي للدولة. ويمكنك باستعلام بسيط معرفة الدولة الخاصة بالمستخدم عن طريق الجدول الوسيط (المدينة) وباستخدام SQL Joins

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...