سؤال

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

  1. استخدم عددًا صحيحًا ولا تهتم بتعيين أي شيء آخر غير 0 أو 1 له.

  2. استخدم حقل حرف يحتوي على "Y" أو "N" كالقيمتين الوحيدتين.

  3. استخدم التعداد مع قيد التحقق.

هل يعرف مطورو Oracle ذوو الخبرة النهج المفضل/المعتمد؟

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

المحلول

وجدت هذا رابط مفيد.

فيما يلي الفقرة التي تسلط الضوء على بعض إيجابيات/سلبيات كل نهج.

يتمثل التصميم الأكثر شيوعًا في تقليد العديد من الأعلام الشبيهة بالطراز الذي تستخدمه عرض قاموس بيانات Oracle ، واختيار "Y" لـ True و "n" لـ FALSE.ومع ذلك ، للتفاعل بشكل صحيح مع بيئات المضيف ، مثل JDBC و OCCI وبيئات البرمجة الأخرى ، من الأفضل تحديد 0 لخطأ و 1 صحيحًا حتى يتمكن من العمل بشكل صحيح مع وظائف GetBoolean و Sepoolean.

إنهم يدافعون بشكل أساسي عن الطريقة رقم 2، من أجل الكفاءة، باستخدام

  • قيم 0/1 (بسبب إمكانية التشغيل التفاعلي مع JDBC's getBoolean() الخ) مع قيد الاختيار
  • أ يكتب من CHAR (لأنه يستخدم مساحة أقل من NUMBER).

مثالهم:

create table tbool (bool char check (bool in (0,1));
insert into tbool values(0);
insert into tbool values(1);`

نصائح أخرى

تستخدم Oracle نفسها Y/N للقيم المنطقية.للاكتمال، تجدر الإشارة إلى أن pl/sql له نوع منطقي، والجداول فقط هي التي لا تحتوي عليه.

إذا كنت تستخدم الحقل للإشارة إلى ما إذا كان السجل يحتاج إلى معالجة أم لا، فقد تفكر في استخدام Y وNULL كقيمتين.يؤدي هذا إلى إنشاء فهرس صغير جدًا (للقراءة السريعة) ولا يشغل مساحة كبيرة جدًا.

لاستخدام أقل قدر من المساحة، يجب عليك استخدام حقل CHAR مقيدًا بـ "Y" أو "N".لا تدعم Oracle أنواع البيانات BOOLEAN أو BIT أو TINYINT، لذا فإن البايت الواحد لـ CHAR صغير بقدر ما يمكنك الحصول عليه.

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

مزايا 0/1:

  • لغة مستقلة.سيكون "Y" و"N" جيدًا إذا استخدمه الجميع.لكنهم لا يفعلون ذلك.في فرنسا يستخدمون "O" و"N" (لقد رأيت ذلك بأم عيني).لم أبرمج في فنلندا لمعرفة ما إذا كانوا يستخدمون "E" و"K" هناك - لا شك أنهم أكثر ذكاءً من ذلك، لكن لا يمكنك التأكد.
  • يتوافق مع الممارسة في لغات البرمجة المستخدمة على نطاق واسع (C، C++، Perl، Javascript)
  • يلعب بشكل أفضل مع طبقة التطبيق على سبيل المثال.بيات شتوى
  • يؤدي إلى لغة SQL أكثر إيجازًا، على سبيل المثال، لمعرفة عدد الموز الجاهز للأكل select sum(is_ripe) from bananas بدلاً من select count(*) from bananas where is_ripe = 'Y' أو حتى (يوك) select sum(case is_ripe when 'Y' then 1 else 0) from bananas

مزايا "Y"/"N":

  • يشغل مساحة أقل من 0/1
  • هذا ما تقترحه شركة Oracle، لذا قد يكون هذا ما اعتاد عليه بعض الأشخاص أكثر

اقترح ملصق آخر "Y"/null لتحقيق مكاسب في الأداء.اذا كنت تملك ثبت أنك بحاجة إلى الأداء، فهذا عادل بدرجة كافية، ولكن تجنبه بخلاف ذلك لأنه يجعل الاستعلام أقل طبيعية (some_column is null بدلاً من some_column = 0) وفي الصلة اليسرى ستخلط بين الكذب والسجلات غير الموجودة.

إما 1/0 أو Y/N مع وجود قيد اختيار عليه.طريقة الأثير على ما يرام.أنا شخصيا أفضل 1/0 لأنني أقوم بالكثير من العمل في لغة Perl، وهذا يجعل من السهل حقا القيام بعمليات Perl Boolean في حقول قاعدة البيانات.

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

قاعدة البيانات التي قمت بمعظم عملي عليها استخدمت "Y" / "N" كقيم منطقية.مع هذا التنفيذ، يمكنك تنفيذ بعض الحيل مثل:

  1. حساب الصفوف الصحيحة:
    حدد المجموع (الحالة عندما يكون BOOLEAN_FLAG = 'Y' ثم 1 آخر 0) من X

  2. عند تجميع الصفوف، قم بفرض المنطق "إذا كان أحد الصفوف صحيحًا، فكل الصفوف صحيحة":
    حدد الحد الأقصى (BOOLEAN_FLAG) من Y
    وعلى العكس من ذلك، استخدم MIN لفرض التجميع على خطأ إذا كان أحد الصفوف خاطئًا.

مثال عملي لتنفيذ الإجابة المقبولة عن طريق إضافة عمود "منطقي" إلى جدول موجود في قاعدة بيانات أوراكل (باستخدام number يكتب):

ALTER TABLE my_table_name ADD (
my_new_boolean_column number(1) DEFAULT 0 NOT NULL
CONSTRAINT my_new_boolean_column CHECK (my_new_boolean_column in (1,0))
);

يؤدي هذا إلى إنشاء عمود جديد في my_table_name مُسَمًّى my_new_boolean_column مع القيم الافتراضية 0.لن يقبل العمود NULL القيم ويقيد القيم المقبولة لأي منهما 0 أو 1.

في قواعد بياناتنا نستخدم التعداد الذي يضمن تمريره إما TRUE أو FALSE.إذا قمت بذلك بإحدى الطريقتين الأوليين، فمن السهل جدًا إما البدء بإضافة معنى جديد إلى العدد الصحيح دون المرور بتصميم مناسب، أو ينتهي الأمر بحقل char الذي يحتوي على Y، y، N، n، T، t، قيم F وf والحاجة إلى تذكر أي قسم من التعليمات البرمجية يستخدم أي جدول وأي إصدار صحيح يستخدمه.

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