سؤال

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

المنطق الأساسي على ما يلي:

  1. للمستخدمين الوصول إلى الإنترنت دورات تدريبية عن طريق المقاعد.يمكن للمستخدمين متعددة المقاعد.
  2. المقاعد يتم شراؤها من قبل الشركات و كثير إلى العلاقة مع العديد من المنتجات.
  3. المنتج لديها العديد من العلاقات مع الوحدات.
  4. وحدة لديها العديد من-إلى-العلاقة مع العديد من الدروس.
  5. دروس المستخدمين النهائيين الوصول إلى التدريب.
  6. إلى تعكير المياه ، لسبب أو آخر بعض المستخدمين متعددة المقاعد التي تحتوي على نفس المنتجات.
  7. شهادة تجري على أساس لكل منتج ، وليس على المقعد الواحد من الأساس.
  8. المستخدمين لديها العديد من-إلى-العلاقة مع العديد من الدروس التي متجر وضعها الحالي أو نقاط الدرس.
  9. المستخدمين التصديق على المنتج عند استكمال جميع الدروس في جميع وحدات المنتج.
  10. ومن المهم أيضا أن تعرف عند جميع الدروس ولا وحدة يتم الانتهاء من قبل المستخدم.
  11. بعض المقاعد من أجل إعادة التأهيل وهذا يعني أن المستخدمين التي كانت معتمدة للمنتج يمكن الاشتراك واتخاذ التأهيل الامتحان.
  12. بسبب المادة 11 ، يمكن للمستخدمين وسوف يكون العديد من الشهادات السجلات.
  13. تحرير:عندما يقوم المستخدم يكمل الدرس (درجات أفضل من 80%) ثم قام المستخدم (وفقا الأعمال الحالية المنطق) الانتهاء من الدرس جميع المنتجات وجميع المقاعد التي تحتوي على الدرس.

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

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

يمكنك عرض الجزء ذي الصلة من مخطط قاعدة البيانات هنا: http://lpsoftware.com/problem_db_structure.png

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

المحلول

ما تبحث عنه هو العلائقية شعبة لم تنفذ مباشرة في SQL, ولكن يمكن القيام به.البحث في google عن أمثلة أخرى.

نصائح أخرى

بعد نظرة سريعة على المخطط أعتقد أن واحدة من الأشياء التي يمكنك القيام به هو إنشاء 'to_be_certified' الجدول.ملء مع user_id, product_id و seat_id عندما يكون المنتج هو تعيين إلى مقعد (عندما product_seat_rtab هو بالسكان).

على إضافة سجل إلى certification_rtab الجدول حذف سجل المقابلة في 'to_be_certified' الجدول.هذا وسوف تعطيك سهولة الوصول إلى جميع المنتجات التي هي معتمدة على المستخدمين وتلك التي ليست كذلك.

للتخلص من تكرار product_ids ، يمكنك الفريق قبل product_id.

تحتاج إلى إجراء تغييرات على lessonstatus_rtab الجدول:

CREATE TABLE lessonstatus_rtab (
  user_id    INT NOT NULL,
  seat_id    INT NOT NULL,
  lesson_id  INT NOT NULL REFERENCES lesson_rtab,
  accessdate TIMESTAMP,
  score      NUMERIC(5,2) NOT NULL DEFAULT 0,
  PRIMARY KEY (user_id, seat_id, lesson_id),
  FOREIGN KEY (user_id, seat_id) REFERENCES user_seat_rtab (user_id, seat_id)
);

ثم يمكنك الاستعلام عن كل منتج أن المستخدم لديه مقعد, هل هو معتمد ؟ ويفترض أن عدد من الدروس وسجل له 50% أو أعلى هو نفس عدد الدروس في جميع وحدات المنتج.

SELECT p.name, us.user_id, us.seat_id, COUNT(l.id) = COUNT(lu.lesson_id) AS is_certified
FROM user_seat_rtab AS us
 JOIN seat_rtab AS s ON (s.id = us.seat_id)
 JOIN product_seat_rtab AS ps ON (ps.seat_id = s.id)
 JOIN product_rtab AS p ON (p.id = ps.product_id)
 JOIN product_module_rtab AS pm ON (pm.product_id = p.id)
 JOIN module_rtab AS m ON (m.id = pm.module_id)
 JOIN module_lesson_rtab AS ml ON (ml.module_id = m.id)
 JOIN lesson_rtab AS l ON (l.id = ml.lesson_id)
 LEFT OUTER JOIN lessonstatus_rtab AS lu 
   ON (lu.lesson_id = l.id AND lu.user_id = us.user_id 
     AND lu.seat_id = us.seat_id AND lu.score > 0.50)
GROUP BY p.id, us.user_id, us.seat_id;

تحديث:

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

لذلك أود أن تطبيق التغييرات التالية إلى المخطط وشارك مع السؤال:

DROP TABLE user_seat_rtab;
RENAME TABLE certification_rtab TO something_different;

بديلا مزيد من تطبيع هذا الهيكل الجديد سوف يكون أن تفعل شيئا مثل هذا:

ALTER TABLE user_seat_rtab 
    DROP PRIMARY KEY;
    ADD COLUMN product_id int(10) unsigned NOT NULL;
    ADD CONSTRAINT pk_user_seat_product PRIMARY KEY (user_id, seat_id, product_id);
    ADD CONSTRAINT fk_product_user_seat FOREIGN KEY (product_id) REFERENCES product_rtab(id) ON DELETE RESTRICT;

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

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