بنية قاعدة بيانات عن "شارة" نظام & التعسفي معايير (MySQL/PHP)

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

  •  20-08-2019
  •  | 
  •  

سؤال

سريع-السؤال:

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

تخزين شارة العنوان, معايير, الخ.ما من شأنه أن الجدول تبدو وكأنها ؟

  • badge_id (1)
  • badge_title (10K شارة)
  • badge_image (10k.jpg)
  • badge_criteria ([المشاركات] >= 10000)
    ...

ينضب-السؤال:

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

شارات التي تعتمد على المستخدم نقطة (افتراضية "10k شارة") سوف تبدو جميلة على التوالي إلى الأمام.أي الحدث الذي يؤثر على المستخدمين سمعة (القطرية, downvotes, إجابة مقبولة ، وما إلى ذلك) أن استدعاء الأسلوب استعراض المستخدمين سمعة الجديد ، ويحتمل أن تكون جائزة الشارة.

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

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

أي تلميحات ؟

ستاكوفيرفلوو الأرشيف:


ملاحظة:أنا لا أطلب كيفية ربط شارات مع المستخدمين.أنا لا أطلب كيفية منح شارات (لن يتم ذلك برمجيا)

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

المحلول

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

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

ReputationBadgeCriteria
  BadgeId
  BadgeName
  MinReputation

بدلا من ذلك ، يمكن استخدام نوع من DSL إلى كتابة "قواعد" ولكن كنت في نهاية المطاف الحاجة إلى أيضا إنشاء محلل تحليل القواعد عند قراءتها فضلا عن شيء لتنفيذ هذه القواعد.اعتمادا على تعقيد في DSL, هذا قد لا يكون بالأمر الهين.يبدو أن هذا هو المسار الذي تسير في السؤال مع وجود معايير عمود (ويفترض نص عادي) الذي لديه شيء من هذا القبيل "[سمعة] > 1000" أو "[المشاركات] > 5" في ذلك.لا يزال لديك وتحليل وتنفيذ تلك القواعد و تعقيد الكتابة أن تفعل شيئا لذلك هو يعتمد على مدى تعقيد تريد تلك القواعد.

أنصح لك قراءة هذه يوميا WTF المواد للحصول على معلومات حول سبب هذا النهج يؤدي إلى الألم.

نصائح أخرى

اعتمادا على مدى تريد أن تذهب مع ذلك المخطط يمكن الحصول على معقد جدا.يبدو لي أن عناصر القاعدة تحتاج إلى المسار:

Badges awarded
Points earned

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

Point categories
Badge categories

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

badges:
badge_id
badge_name
required_points
....

point_categories:
point_id
category_name
weighting (optional)
...

point_groups:
badge_id
point_id
weighting (optional)
...

user_points:
user_id
point_id
points
...

user_badges:
user_id
badge_id
points_earned
badge_awarded (yes/no)
...

الخاص بك "المشرف" واجهة شأنها أن تسمح لشخص ما خلق جديد شارة اختيار أي نقطة الفئات المطلوبة لكسب تلك الشارة (point_groups).كلما مستخدم يكسب النقاط (user_points), تحديث user_points الجدول ، ثم تحديد أي شارات هذه النقاط من شأنها أن تسهم في (point_groups).ثم إعادة ترجمة نقاط الشارات التي تأثرت النقاط المكتسبة و تحديث user_badges الجدول مع point_earned.ثم تحقق points_earned الميدانية في user_badges ضد required_points في شارات الجدول.

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

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

كنت تتبع المستخدمين فريدة من نوعها في طاولة واحدة وفريدة من نوعها شارات في آخر ثم إنشاء إشارة مرجعية الجدول أن تتصل بها.

المستخدم يمكن أن يكون العديد من شارات شارة يمكن أن يكون العديد من المستخدمين.

create table users (
id int,
name varchar
)

create table badges (
id int,
badge_name varchar
)


create table user_badges_xref (
user_id int,
badge_id int
)

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

أنا لا أطلب كيفية منح شارات.أنا أسأل كيفية تخزين المعايير داخل قاعدة البيانات.

إذا كنت ترغب في تخزين منطقية العملية المطلوبة لتحديد ما إذا كان هناك شارة حصل في حقل في مكان ما ؟

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

إذا كنت حقا الزواج إلى فكرة تخزين المعايير في هذا المجال ، كنت مخزن أنها SQL بمعلمات وتشغيله بشكل حيوي.

لذلك هذا النوع من الشيء أن يكون في معايير المجال:

select "Badge Earned"
from all_posts 
where user_id = @user_id
having count(*) > 10000

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

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

أعتذر عن كوني موجزة.

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

badge_criteria
badge_key int
badge_criteria varchar(max)

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

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

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

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

تحديث:

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

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

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