كيف يمكنني تصميم حقل يمكن أن يحتوي على قيم رقمية وسلسلة في SQL Server 2005؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

لدي جدول قاعدة بيانات جديد أريد إنشاءه...
يحتوي منطقيا على ID, ، أ name, ، و أ "value".
يمكن أن يكون حقل القيمة هذا رقميًا أو سلسلة أحرف بطبيعته.

لا أعتقد أنني أريد أن أجعل المجال أ varchar, ، لأنني أريد أيضًا أن أكون قادرًا على الاستعلام باستخدام مرشحات مثل WHERE value > 0.5 وكذا.

ما هي أفضل طريقة لنمذجة هذا المفهوم في SQL Server 2005؟

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

أي آراء حول ذلك؟

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

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

المحلول

قد تكون مشكلتك في خلط البيانات هي كيفية فرز Sql 2005 للبيانات النصية.إنه ليس من النوع "الطبيعي".

إذا كان لديك حقل varchar وتقوم بما يلي:

where value > '20.5'

ستكون القيم مثل "5" في النتيجة (كما هو الحال في الفرز المستند إلى الأحرف "5" يأتي بعد "20.5")

ستكون أفضل حالًا مع أعمدة منفصلة للتخزين.

استخدم Coalesce لدمجها في عمود واحد إذا كنت بحاجة إلى دمجها في نتائجك:

select [ID], [Name], Coalesce( [value_str], [value_num] )
from [tablename]

نصائح أخرى

إحدى الطرق الجيدة للحصول على دعم الاستعلام الذي تريده هي أن يكون لديك عمودين:numvalue الذي يخزن رقمًا وtextvalue الذي يخزن الأحرف.يجب أن تكون فارغة أو على الأقل تحتوي على بعض الإعدادات الافتراضية التي لا تمثل أي قيمة.يمكن لتطبيقك بعد ذلك أن يقرر أي عمود سيخزن قيمته وأي عمود سيتركه بلا قيمة.

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

عمودين.

Table: (ValueLable as char(x), Value as numerica(p,s))

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

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

قد يكون البديل هو وجود عمودين أو ثلاثة أعمدة بدلاً من عمود القيمة الواحد.ربما تحتوي على الأعمدة الثلاثة، value_type (التعداد بين "الرقم" و"السلسلة")، وقيمة_الرقم، وقيمة_السلسلة.ثم يمكنك إعادة بناء هذا الاستعلام ليكون

WHERE value_type = 'number' AND number_value > 0.5

لا أعتقد أنك ستتمكن من التجول باستخدام VARCHAR أو NVARCHAR كنوع بياناتك.باستخدام البيانات المختلطة كما تصفها، سيتعين عليك اختبار القيمة عند سحب الحقل من قاعدة البيانات وإجراء عملية CAST أو CONVERT المناسبة بناءً على نوع البيانات.

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

ذلك يعتمد على مصدر البيانات.إذا كنت تحصل على البيانات من المستخدمين (أو نظام آخر) بطريقة حرة ولا تهتم حقًا بنوع البيانات، فإن أفضل طريقة لتخزينها هي الطريقة الأكثر عمومية (varchar، إلخ) .إذا كانت البيانات الواردة أكثر تنظيماً وكنت تهتم بهذه البنية، فمن المنطقي الاحتفاظ بهذه البنية في قاعدة البيانات باستخدام حقول منفصلة.

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

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

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

قد تفكر في استخدام عمودين، أحدهما "سلسلة" والآخر "رقمي" (أيًا كانت المتغيرات المناسبة لهما) مع عمود "السلسلة" NOT NULL والعمود "الرقمي" الذي يسمح بقيم NULL.عند إدراج قيمة، قم دائمًا بملء عمود "السلسلة" المستقل عن النوع، ولكن إذا كانت القيمة رقمية، فقم أيضًا بتخزينها في العمود "الرقمي".الآن لديك مؤشر مدمج فيما يتعلق بالنوع (إذا تم ملء العمود "الرقمي" فهو رقمي، وإذا لم يكن عبارة عن سلسلة)، يمكنك دائمًا سحب القيمة للعرض من عمود "السلسلة"، ويمكنك استخدامه القيمة "الرقمية" في العمليات الحسابية أو للفرز/المقارنة الرقمية المناسبة حسب الحاجة.يمكنك دائمًا إضافة عمود ثالث يشير إلى نوع القيمة، ولكن هذا الأسلوب يلغي الحاجة إلى ذلك.لاحظ أنك قد تفكر في الحفاظ على القيم الرقمية وقيم السلسلة باستخدام مجموعة من مشغلات INSERT وUPDATE.

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