كيفية تعيين جمعية العديد من إلى العديد من الرابطة لفصل معين إلى طاولتين مختلفتين؟

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

سؤال

لدي قسيمة - POJO معين إلى طاولتين. تقوم المشاركة الأولى بتعيين اسم كيان "Vouchera" وخرائط POJO إلى Tablea. يستخدم التعيين الثاني "Voucherb" كاسم كيان وخرائط POJO إلى المائدة.

الآن لدي أيضا عميل POJO معين إلى Tablec. هذه المراجع POJO قسائم في القائمة.

<list name="vouchers" table="TableC_vouchers">
  <key column="pid"/>
  <list-index column="position" base="0"/>

  <!-- how to do that right -->
  <many-to-many column="voucher_id" entity-name="voucherB"/>
</list>

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

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

المحلول

نموذجك الأساسي يبدو خطأ. لك Voucher الكيان يفترض أن العديد من السمات - هل يتغير كل منهم بعد استخدامه من قبل Customerب أشك في ذلك. ومع ذلك، فأنت تكررها في جداولك A و B مما يعني أن مخططك غير طبيعي.

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

Voucher(id, other attributes) // doesn't change from what you have now
Customer (id, other attributes) // doesn't change except for many-to-many; see below
UsedVoucher(id,
 voucher, // what Voucher was used by that customer
 customer, // what Customer has used that voucher
 changed voucher attributes, // if any
 additional attributes // if needed, such as date/time when voucher was used
)

لديك "كثير إلى كثير" Customer سيصبح "واحد إلى كثير" (مجموعات من القسائم المستخدمة من قبل هذا العميل) إذا كنت بحاجة إليها كملكية قابلة للصيانة؛ وإلا فإنه يسهل استرجاعه عبر الاستعلام.

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

نصائح أخرى

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

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

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

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