هل يجب علي استخدام NULL أو سلسلة فارغة لتمثيل عدم وجود بيانات في عمود الجدول؟

StackOverflow https://stackoverflow.com/questions/167952

  •  03-07-2019
  •  | 
  •  

سؤال

سلسلة فارغة أو فارغة - هل إحداهما أفضل من الأخرى في عدم تمثيل أي بيانات في عمود الجدول؟(أستخدم MySQL على وجه التحديد، لكنني أعتقد أن هذا مستقل عن النظام.) هل هناك مزايا/عيوب رئيسية لاستخدام أحدهما على الآخر، أم أنه مجرد تفضيل للمبرمج؟

هل كانت مفيدة؟

المحلول

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

ومعظم الناس الذين قلت لك لاستخدام كما قدم NULL على سبيل المثال حيث NULL يعني شيئا مختلفا عن سلسلة فارغة. وفي تلك الأمثلة، أنهم على حق.

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

نصائح أخرى

وخالية. سلسلة فارغة ليست "لا توجد بيانات"، فإنه من البيانات التي يحدث أن تكون فارغة.

وخالية من الأفضل "" يمثل في الواقع البيانات وانها لن تسجيل نفسه في التعليمات البرمجية

في سياق نموذج قاعدة بيانات علائقية، لاغية يشير "لا قيمة لها" أو "قيمة غير معروفة". كان موجودا بالضبط الغرض تصفون.

وUPDATE: عذرا، لقد نسيت أن أضيف أن في حين أن معظم (جميع؟) RDMBSs استخدام هذا التعريف نفسه لاغية، هناك الاختلافات البسيطة في كيفية اغية تتم معالجة. على سبيل المثال، والخلية أوراكل السماح بلا قيم متعددة في العمود فريد (أو مجموعة من الأعمدة)، لاغية ليست قيمة، ولا يمكن أن تعتبر فريدة من نوعها (خالية! = فارغة). ولكن آخر مرة كنت MS SQL Server، فإنه يسمح فقط لاغية واحد. لذلك قد تحتاج إلى النظر في سلوك RDBMS، وعما إذا كان العمود في السؤال سوف تكون مقيدة أو فهرستها.

ولا. يمثل غياب البيانات وغياب الصفوف في علاقة.

لأسباب تتعلق بالأداء قد ترغب في تجنب ينضم في بعض RDBMS "ولكن في محاولة لتصميم نموذج لذلك أن المعلومات التي يمكن المفقودين في علاقة منفصلة.

وهنا هي الروابط زوجين من موقع الخلية:

http://dev.mysql.com /doc/refman/5.0/en/problems-with-null.html

http://dev.mysql.com /doc/refman/5.0/en/working-with-null.html

وأنا لم أقرأ مرة واحدة، أن قيمة NULL هو 2 بت، حيث مثل سلسلة فارغة هو 1 فقط قليلا. 99٪ من الوقت وهذا لن يحدث أي فارق، ولكن في جدول كبير جدا عندما لا يهم إذا NULL أو ''، ثم انه قد يكون من الأفضل استخدام '' إذا كان هذا صحيحا.

ودائما استخدام NULL. النظر في الفرق بين "أنا لا أعرف ما هو رقم هاتف هذا الشخص" (NULL)، و "هذا الشخص تركها فارغة" (فارغة).

استخدم الأداة المناسبة لهذا المنصب. NULL يمكن أن يعني أنه لم يتم تقديم قيمة (حتى الآن) أو يمكن أن يعني أن لا قيمة قابلة للتطبيق.

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

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

وانتبه إلى أن سلسلة في سلسلة، جنبا إلى جنب مع أي شيء NULL ينتج NULL. على سبيل المثال: CONCAT (NULL، "فو ') غلة فارغة. تعلم كيفية استخدام وظيفة تتجمع () إذا كنت ترغب في تحويل NULL إلى بعض القيمة الافتراضية في تعبير SQL.

ومعظم اغية الوقت هو أفضل. ربما يكون هناك بعض الحالات التي يكون فيها ليس هناك فرق كبير، لكنها قليلة. فقط تذكر عند الاستعلام أن field = '' ليست هي نفسها كما field is null (في الخلية، على الأقل).

وبقدر ما استطيع ان اقول، وأوراكل لا يميز الفرق.

select 1 from (select '' as col  from dual) where col is null;

والنظر لماذا لا يوجد بيانات في العمود. يعني تصميم الجدول هو قذر؟ وعلى الرغم من لا تروق بلا قيم، هناك مناسبات عندما يكونون المناسب (أو مناسبا بما فيه الكفاية)، والنظام لن يموت عادة. فقط لا تسمح القيم الخالية في كل ما هو مفتاح مرشح (مفتاح أساسي أو بديل).

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

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

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

واحد مشكلة كبيرة لقد كان دائما مع NULL هي أن "SELECT * من TBL WHERE عمود = NULL" دائما بإرجاع مجموعة نتائج فارغة. NULL لا يمكن أبدا أن يكون على قدم المساواة إلى أي شيء، بما في ذلك NULL. الكلمة SPEICAL "عمود فارغ" هو السبيل الوحيد للتحقق من كون شيء باطل. إذا ظهر بعيدا عن لاغية، ثم المقارنة ستنجح: "عمود = ''" عادت 7 الصفوف

ولقد فعلت اثنين من التطبيقات الرئيسية DB من الصفر حيث في النهاية لقد أعرب عن أسفه باستخدام NULL. في المرة القادمة، أي القيم الخالية بالنسبة لي!

وهناك استثناء واحد مهم. وقال بيل Karwin "CONCAT (NULL،" فو ") ينتج فارغة" وهو صحيح بالنسبة لمعظم RDBMSs ولكن ليس لأوراكل.

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

وعلى وجه التحديد، في CONCAT أوراكل (NULL، "فو ')' فو 'الغلة. بفضل أوراكل، لقد فقدت الآن بلا قيم بلدي الذي قد لا يهم لكم ولكن بالتأكيد يحدث فرقا عندما يتم تمرير البيانات إلى RDBMSs أخرى لمزيد من المعالجة.

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

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

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

وفيما يتعلق بمسألة عدم استخدام القيم الخالية من حيث المبدأ، هناك حالات حيث هم في واقع الأمر ضروري. كشخص يعمل مع الإحصاءات على نطاق واسع، فإنه من الشائع لمقدمي البيانات لتعطيك مجموعات البيانات مع بيانات غير كاملة. على سبيل المثال، في مجموعة بيانات من الناتج المحلي الإجمالي في البلاد، يمكنك العثور على المفقودين أرقام الناتج المحلي الإجمالي في السنوات السابقة واللاحقة. أحد الأسباب هو أن ليس هناك بيانات رسمية عن تلك السنوات من حكومة البلاد. سيكون من الخطأ أن نستنتج أن ناتجها المحلي الإجمالي هو صفر (DUH!)، وتظهر قيمة صفر في البيانات المستخرجة أو رسم بياني. القيمة الصحيحة فارغة، مما يعني أنه لا يوجد لديك بيانات حتى الآن. المستخدم النهائي يفسر datapoints المفقودة في البيانات والرسوم البيانية المستخرجة كما NOT الصفر بشكل صحيح. وعلاوة على ذلك، فإنه لن يسبب أخطاء في الحسابات وخصوصا عندما كنت تفعل المتوسط.

وبعض "القواعد" التي من المنطقي نظريا في الواقع يكون حلا الفقراء أو غير صحيحة في قضيتك.

أجد القيم NULL مفيدة للتكامل المرجعي.في حالة MySQL، إذا تم تعيين الحقل على NOT NULL، فإن الإدخال يتطلب تعيين البيانات؛وإلا، فإن NULL هي قيمة محتملة ولا يتم فرض قيد المفتاح الخارجي.

  1. بطاقة تعريف:المفتاح الأساسي
  2. معرف المنتج:المفتاح الخارجي ليس فارغًا
  3. ref_id:(فارغة)

منطقة id وproduct_id مطلوبة دائمًا.يمكن ضبط ref_id على NULL.ومع ذلك، إذا تم استخدام أي قيمة أخرى، فيجب أن تستوفي قيد FOREIGN KEY.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top