سؤال

لدي جدول يمثل قيم مقاييس الملف المصدر عبر مراجعات المشروع، مثل ما يلي:

Revision FileA FileB FileC FileD FileE ...
1           45     3    12   123   124
2           45     3    12   123   124
3           45     3    12   123   124
4           48     3    12   123   124
5           48     3    12   123   124
6           48     3    12   123   124
7           48    15    12   123   124

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

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

  • يتجنب النسخ المتماثل ويستخدم المساحة بكفاءة (يتطلب التمثيل غير المتفرق حاليًا 260 جيجابايت (بيانات + فهرس) لأقل من 10% من البيانات التي أرغب في تخزينها)
  • يسمح لي باسترداد القيم الخاصة بمراجعة محددة بكفاءة باستخدام استعلام SQL (دون تكرار المراجعات أو الملفات بشكل صريح)
  • يسمح لي باسترداد المراجعة بكفاءة لقيمة مترية محددة.

ومن الناحية المثالية، لا ينبغي أن يعتمد الحل على شيء معين نظام إدارة قواعد البيانات الراديوية (RDBMS). ويجب أن تكون متوافقة مع بيات شتوى.إذا لم يكن ذلك ممكنًا، فيمكنني التعايش مع استخدام الميزات الخاصة بـ Hibernate أو MySQL أو PostgreSQL.

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

المحلول

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

CREATE TABLE Revision_Files
(
    start_revision_number   INT NOT NULL,
    end_revision_number     INT NOT NULL,
    file_number             INT NOT NULL,
    value                   INT NOT NULL,
    CONSTRAINT PK_Revision_Files PRIMARY KEY CLUSTERED (start_revision_number, file_number),
    CONSTRAINT CHK_Revision_Files_start_before_end CHECK (start_revision_number <= end_revision_number)
)
GO

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

SELECT
    REV.revision_number,
    RF.file_number,
    RF.value
FROM
    Revisions REV
INNER JOIN Revision_Files RF ON
    RF.start_revision_number <= REV.revision_number AND
    RF.end_revision_number >= REV.revision_number
GO

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

SELECT
    REV.revision_number
FROM
    Revision_Files RF
INNER JOIN Revisions REV ON
    REV.revision_number BETWEEN RF.start_revision_number AND RF.end_revision_number
WHERE
    RF.file_number = @file_number AND
    RF.value = @value
GO
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top