كيف يمكنك هيكل التكوين البيانات في قاعدة البيانات ؟

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

سؤال

ما هي الطريقة المفضلة لتخزين تكوين التطبيق البيانات في قاعدة البيانات.من بعد أن فعلت هذا في الماضي بنفسي, لقد استخدمت طريقتين للقيام بذلك.

  1. يمكنك إنشاء جدول حيث يمكنك تخزين مفتاح/قيمة أزواج ، حيث الرئيسية هو اسم config الخيار و القيمة القيمة.برو من هذا هو إضافة قيم جديدة سهلة و يمكنك استخدام نفس إجراءات تعيين/الحصول على البيانات.سلبيات لديك مصنف بيانات القيمة.
  2. بدلا من ذلك, يمكنك تضمين تكوين الجدول مع كل عمود هو اسم من قيمة و نوع البيانات.الجانب السلبي لهذا هو أكثر الصيانة إنشاء قيم جديدة ، ولكن لأنها تتيح لك كتابة البيانات.

بعد استخدامها على حد سواء ، تفضيلات الكذب مع الخيار الأول كما في أسرع لضبط الامور ، ولكن أيضا أكثر خطورة ويمكن أن تقلل من الأداء (قليلا) عند البحث عن البيانات.هل من أحد لديه أي بديل الأساليب ؟

التحديث

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

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

المحلول

يمكنك تعظيم الخيار 1 إلى 3 عمود, إعطاء نوع البيانات.التطبيق الخاص بك يمكن من استخدام هذه البيانات نوع العمود يلقي القيمة.

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

نصائح أخرى

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

والأهم من ذلك النظر في هذه الأمور مع التكوين:

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

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

يمكنني استخدام الخيار 1.

يبدو مبالغة استخدام ديسيبل التكوين البيانات.

تحرير (آسف طويلة جدا بالنسبة مربع التعليق):بالطبع ليس هناك قواعد صارمة على كيفية تنفيذ أي جزء من البرنامج الخاص بك.من أجل حجة ، فترة زمنية محددة المفكات العمل على بعض مسامير فيليبس!أعتقد الحكم في وقت مبكر جدا قبل معرفة ما في السيناريو الخاص بك هو.

قواعد البيانات العلائقية تتفوق في البيانات الضخمة متجر يتيح لك سرعة تخزين وتحديثها واسترجاعها إذا config يتم تحديث البيانات وقراءة باستمرار, ثم بكل الوسائل استخدام ديسيبل.

سيناريو آخر حيث ديسيبل قد يكون منطقيا عندما يكون لديك مزرعة خادم حيث تريد قاعدة البيانات الخاصة بك إلى مخزن مركزي التكوين ، ولكن بعد ذلك يمكنك أن تفعل الشيء نفسه مع مشترك أقراص شبكة الاتصال التي تشير إلى ملف تكوين xml.

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

جميع في كل شيء ، كل شيء يعتمد على كيفية التكوين البيانات المستخدمة.

أن يخلص رأيي مع معرفة محدودة التطبيق الخاص بك.أنا متأكد من أنك يمكن أن تجعل القرار الصحيح.

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

كنت بالتأكيد استخدام هذا النهج المستخدم تكوينات / تفضيلات ، إلخ.

المشروع يستخدم قاعدة بيانات الجدول مع أربعة أعمدة:

  1. معرف [pk]
  2. نطاق (الافتراضي 'تطبيق')
  3. الإعداد
  4. القيمة

الإعدادات مع نطاق 'تطبيق' الإعدادات العمومية ، مثل عدد ممكن من المستخدمين في وقت واحد.

كل وحدة لديها نطاق استنادا ؛ لذلك لدينا ResultsLoader و UserLoader مختلف النطاقات ، ولكن كلاهما وضع اسمه 'inputPath'.

التخلف إما المنصوص عليها في التعليمات البرمجية المصدر أو يتم حقنها عبر الحاويات اللجنة الاولمبية الدولية.إذا لا قيمة يتم حقن أو المقدمة في قاعدة البيانات الافتراضي من التعليمات البرمجية المستخدمة (في حالة وجود واحدة).ولذلك التخلف أبدا المخزنة في قاعدة البيانات.

هذا يعمل بشكل جيد جدا بالنسبة لنا.في كل مرة نقوم النسخ الاحتياطي قاعدة البيانات نحصل على نسخة من التكوين وهو مفيد جدا.وهما دائما في المزامنة.

الذهاب مع خيار 2.الخيار 1 هو حقا وسيلة implenting قاعدة بيانات على رأس قاعدة البيانات ، وهذا هو المعروف antipattern التي سوف تعطي لك مشاكل على المدى الطويل.

أستطيع أن أفكر في اثنين على الأقل من الطرق:

(أ) إنشاء جدول مع مفتاح سلسلة القيمة ، تاريخ القيمة, int-القيمة الحقيقية-القيمة الأعمدة.تترك غير مستخدمة أنواع NULL.

(ب) استخدام شكل التسلسل مثل XML ، YAML أو JSON و تخزين كل شيء في فقاعة.

حيث يمكنك تخزين إعدادات التكوين الخاصة بك التطبيق يحتاج للاتصال قاعدة البيانات ؟

لماذا لا تخزين أخرى config هناك معلومات أيضا ؟

كنت أذهب مع الخيار 1 إلا إذا كان عدد من خيارات التكوين كانت صغيرة جدا (سبعة أو أقل)

في الشركة, نحن نعمل على استخدام خيار واحد (القاموس بسيط-مثل الجدول) مع تطور.نحن السماح سلسلة الاستبدال باستخدام الرموز التي تحتوي على اسم config متغير أن تكون بديلا.

على سبيل المثال الجدول قد تحتوي على الصفوف ('سلسلة اتصال قاعدة البيانات', 'jdbc://%host%...') و ('المضيف', 'س').وتغليف ذلك مع خدمة بسيطة أو الإجراء المخزن طبقة يسمح بسيط للغاية ، ولكن مرنة ، العودية التكوين.وهو يدعم لدينا عدة بيئات معزولة (ديف, اختبار, برود, الخ).

لقد استعملت كل من 1 و 2 في الماضي, و أعتقد أن كلاهما رهيب الحلول.أعتقد الخيار 2 هو الأفضل لأنه يسمح الكتابة ، لكنه أكثر القبيح من الخيار 1.أكبر مشكلة لدي مع أي هو الإصدار ملف التكوين.يمكنك إصدار SQL بشكل معقول باستخدام معيار أنظمة التحكم في الإصدار ، ولكن دمج التغييرات عادة ما تكون إشكالية.إعطاء فرصة للقيام بذلك "الحق" ، ربما إنشاء مجموعة من الجداول واحد لكل نوع من التكوين المعلمة (ليس بالضرورة لكل معلمة نفسها) ، وبالتالي الحصول على فائدة من الكتابة والاستفادة من مفتاح/قيمة النموذج عند الاقتضاء.يمكنك أيضا تنفيذ أكثر تقدما هياكل هذه الطريقة ، مثل قوائم الهرمية ، والتي سوف ثم تكون مباشرة queryable قبل التطبيق بدلا من الاضطرار إلى تحميل config ثم تحويل ذلك بطريقة أو بأخرى في الذاكرة.

أنا أصوت للخيار 2.من السهل أن نفهم والحفاظ عليها.

الخيار 1 هو جيد بالنسبة قابلة للتوسيع بسهولة, تخزين مركزي الموقع.بالإضافة إلى بعض من العمود الكبير اقتراحات من قبل الناس مثل RB, هوغو, إليوت, كنت قد تنظر أيضا في:

وتشمل العالمية/إعداد المستخدم العلم مع المستخدم الحقل أو حتى مستخدم/آلة الحقل (على آلة محددة واجهة المستخدم نوع الإعدادات).

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

يمكنني استخدام مزيج من الخيار 2 و XML الأعمدة في SQL server.يمكنك أيضا وان لم لإضافة تحقق القيد للحفاظ على طاولة في صف واحد.

CREATE TABLE [dbo].[MyOption] (
  [GUID] uniqueidentifier CONSTRAINT [dfMyOptions_GUID] DEFAULT newsequentialid()  ROWGUIDCOL NOT NULL,
  [Logo] varbinary(max) NULL,
  [X] char(1)  CONSTRAINT [dfMyOptions_X] DEFAULT 'X' NOT NULL,
  CONSTRAINT [MyOptions_pk] PRIMARY KEY CLUSTERED ([GUID]),
  CONSTRAINT [MyOptions_ck] CHECK ([X]='X')
)

عن الإعدادات التي لا علاقة أي db الجداول ، ربما تذهب EAV النهج إذا كنت في حاجة إلى db للعمل مع القيم.وإلا تسلسل قيمة الحقل هو جيد إذا كان حقا مجرد متجر التطبيقات البرمجية.

ولكن ماذا عن شكل حقل واحد لتخزين متعددة إعدادات التكوين ليتم استخدامها من قبل db ؟

مثل حقل واحد لكل مستخدم الذي يحتوي على جميع الإعدادات المتعلقة messageboard عرض (مثل ترتيب الفرز الافتراضي ، ومنعت المواضيع ، الخ) ، وربما آخر مع جميع إعداداتها عن موضوع (مثل لون النص, bg اللون ، إلخ.)

تخزين الهرمي والوثائق في relational DB هو الجنون.أولا: إما أن أجاد لهم ، إلا أن تتحد بهم في مرحلة لاحقة.أو هناك bunged داخل النقطة ، حتى أكثر غباء.

لا تستخدم استخدام relational db غير البيانات العلائقية ، أداة لا يصلح.النظر في شيء مثل MongoDB أو CouchDB هذا.المخطط-لا أقل-مخازن البيانات العلائقية.متجر أنها سلمان لو انها نازلة السلك في أي وسيلة العميل استخدام XML serverside.

CouchDB يعطيك الإصدارات في الخروج من مربع.

لا تكوين مخزن البيانات في قاعدة البيانات ما لم يكن لديك سبب وجيه جدا.إذا كان لديك سبب وجيه جدا, و هي على يقين تماما أنك سوف تفعل ذلك ، ربما يجب تخزينه في شكل التسلسل البيانات مثل JSON أو YAML (لا XML, إلا إذا كنت فعلا في حاجة الى لغة توصيف تكوين التطبيق الخاص بك-ثق بي, لا) كسلسلة.ثم يمكنك فقط قراءة الخيط, واستخدام أدوات في أي لغة كنت تعمل في قراءة وتعديله.تخزين السلاسل مع الطوابع الزمنية لديك بسيطة الإصدارات مخطط مع القدرة على تخزين البيانات الهرمية في نظام بسيط جدا.حتى إذا كنت لا تحتاج هرمية التكوين البيانات ، على الأقل الآن إذا كنت في حاجة إليها في المستقبل لن تضطر إلى تغيير إعدادات التكوين واجهة للحصول عليه.بالطبع تفقد القدرة على القيام العلائقية الاستفسارات على التكوين البيانات ، ولكن إذا كنت تخزين أن الكثير التكوين البيانات, ثم ربما كنت تفعل شيئا خاطئا جدا على أي حال.

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

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