سؤال

كيف يمكنني استخدام JTable لعرض وتحرير خصائص السمة على الكيانات التي تم استردادها من الكيان السمة قيمة (EAV) متجر (أ relational DBMS)?

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

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


يحتاج المستخدم أن يكون قادرا على:

  1. تصفية/البحث الكيانات من صفاتهم

  2. اختر السمات التي تظهر (أعمدة)

  3. نوع الكيانات عن طريق اختيار سمات

  4. تحرير السمة القيم

  5. القيام بعمليات على كيانات مختارة

  6. (اختياري) القدرة على حفظ عرض لاستخدامها في وقت لاحق.


متطلبات النظام:

  1. عدد من الكيانات:يحتاج إلى مقياس يصل إلى 100K+ كيانات فريدة

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

  3. التخزين الأساسية:H2 قاعدة البيانات (بالفعل تصميم), التواصل عن طريق JDBC

  4. الذاكرة:ليس كل شيء يصلح ، بطريقة أو بأخرى حتى يحتاج إلى سحب من DBMS الاستفسارات

  5. الأداء:يجب تقليل عدد الاستعلامات اللازمة DBMS (استعلام واحد في السمة حسنا ، لقد شكل مع 1 الاستعلام في طريقة عرض جدول ، لكنه سيء).

  6. الاستفسارات:استعلام واحد يجب أن تكون هناك حاجة إلى توليد قائمة الكيانات مطابقة البحث/تصفية.وإلا ضخمة أداء سيئا.

  7. إعادة استخدام البيانات:يجب أن لا تضطر إلى إعادة الاستعلام أو إعادة فرز القائمة بأكملها عند إضافة عمود.


الأشياء التي كنت قد بحثت في:

  1. المزجج قوائم المكتبة

    • الايجابيات:

      • مرنة حول عمود المناولة
      • سهلة التنفيذ فرز/تصفية الكيانات
      • مرنة حول عمود تنسيق عرض وتحرير
    • سلبيات:

      • كائن واحد لكل كيان (إذا كانت الكائنات المعقدة الذاكرة العلوية يصبح خطيرا مشكلة في الذاكرة!)
      • كائن مسؤولة عن جميع الوظائف...ولكن الكائنات يجب أن تكون بسيطة الذاكرة الأسباب
      • كيف يمكنني دعم المستخدم اختيار الأعمدة دون HashMap كل كيان الكائن ؟
  2. تمديد AbstractTableModel إلى بيانات الخريطة من JDBC ResultSet إلى الصفوف والأعمدة

    • الايجابيات:
      • ترحيل النتائج يتجنب مشكلة في الذاكرة
      • البحث/تصفية مباشرة في SQL
      • الذاكرة-ودية ، لا يجب أن تجعل كائن في الصف
    • سلبيات:
      • تنفيذ الأعمدة المخصصة و الفرز هو الألم (رأس الجدول العارض ، وإدارة فرز أعمدة النظام ، الخ)!
      • ربما تضطر إلى كتابة مخصص JTableColumnModel جدا, و هذا يحصل فوضوي!
      • وقد التعامل مع SQL الكثير ، حتى إذا DB schema التغيرات إلى إعادة كتابة أجزاء متعددة من التعليمات البرمجية!
      • من الصعب الحفاظ على كيان معلومات معرف
  3. ORM

    • الايجابيات:
      • تم تصميم خريطة DB الصفوف الكائنات
      • توفر إدارة الكائن
    • سلبيات:
      • أسوأ حل ممكن الكيان السمة-نموذج القيمة
      • يجب أن يتعلم الكتابة ORM رمز بالإضافة إلى DBMS & كود جافا!
      • الكيانات يمكن أن يكون أي عدد من الصفات ، ORM هو جيد فقط مع ساكنة ، محدودة سمات كائن
      • تفقد المرونة/سرعة SQL مخصص

هل هناك خيار أفضل أن فاتني ، أو طريقة ذكية لجعل المزجج قوائم أو العرف نموذج الجدول أسهل ؟

لقد تجاهل ORM كخيار بالفعل بسبب كم يقابل ذلك هو EAV التخزين.

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

المحلول

أعتقد أن الخيار الأفضل هو أن تذهب مع 'توسيع AbstractTableModel مع شكل خريطة البيانات من JDBC ResultSet لأن

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

تحرير: واحد مجنون شيء أود القيام به لإنشاء مكون مخصص و تفعل كل تقديم نفسي وإجراء عمليات تحرير مع وضع جيد JTextField و JComboBox.

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

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

إزالة من السهل كما كنت لا تظهر قيم هذا العمود.

Edit3:

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

أيضا إذا كان لديك الكثير من سلاسل متطابقة في النموذج الخاص بك استخدام خريطة بسيطة من سلسلة إلى سلسلة ذاكرة التخزين المؤقت عند الاستعلام بيانات من قاعدة البيانات.هذه الطريقة طن من زائدة سلسلة الكائنات يمكن GC-d على الفور.

Edit4:

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

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