سؤال

خلفية

لدي طاولة مع أعمدة معرف، oritomid، forkomid.

يمكن أن يكون هناك العديد من الصور المرتبطة بميزة واحدة ويمكن أن تكون هناك العديد من الخصائص المرتبطة صورة واحدة.

imageId - many-to-many - propertyId

لدي قائمة بالشركات وأريد معرفة جميع الصور المرتبطة بجميع المشاركين باستخدام السبات.

مشكلة.

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

select imageIds where imageId in (imageIds obtained in previous step) where propertyId = x

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

أيضا، عندما أحصل أخيرا على قائمة ImageIds، هل هي فكرة جيدة (دعونا لا نأخذ في الاعتبار عدد النتائج) لتخزينها في جلسة المستخدم وتشبها أو هل هي فكرة جيدة لتكرار العملية بأكملها أو يجب عليها أنا أعتبر تخزينها في DB كل الغرض من الصفحات؟

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

المحلول

إليك مشكلة في مخطط قاعدة البيانات الخاصة بك:

أنت تحاول Cram 3 ارتباط منفصل (Image - Collection، Image - الممتلكات، المجموعة - الملكية) إلى واحدة imagecollection. جدول. هذا ليس شيئا جيدا. بينما ربما يمكنك الابتعاد عن هذا باستخدام SQL عادي (بتكلفة كبيرة من الصفوف ذات الأعمدة الفارغة في هذا الجدول)، فلن تتمكن من تعيين هذا بشكل صحيح في السبات. راجع للشغل، هذا الجدول لا يحتاج إلى مفتاح أساسي بديل.

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

@Entity
public class Image {
  @ManyToMany
  @JoinTable(
    name="IMAGE_PROPERTIES",
    joinColumns=@JoinColumn(name="IMAGE_ID"),
    inverseJoinColumns=@JoinColumn(name="PROPERTY_ID")
  )
  private Collection<Property> properties;

  ...
}

IMAGE_PROPERTIES سوف يكون الجدول فقط IMAGE_ID و PROPERTY_ID الأعمدة. ستملك COLLECTION_IMAGES و COLLECTION_PROPERTIES جداول مثل ذلك أيضا.

ستتمكن بعد ذلك من الاستعلام عن الصور عن طريق أسماء الممتلكات مثل:

from Image img
  left join img.properties as prop
  with prop.name in ('Tag1', 'Tag2', 'Tag3')

إذا كانت ممتلكاتك هي حقا مثل العلامات، نلقي نظرة على هذه المقالة من أجل و / أو / Union Query أمثلة.

إذا كانت الخصائص حقا خصائص (أي، فإن لديهم دورة حياة كيان المالك ولا يمكنهم الانتماء إلى أكثر من كيان واحد في وقت واحد)، والنظر في تقسيمهم إلى طاولين (واحد للصور والأخرى للمجموعات) واستخدام One- إلى العديد من الجمعيات. بهذه الطريقة لن تحتاج IMAGE_PROPERTIES و COLLECTION_PROPERTIES جداول من فوق.

نصائح أخرى

لذلك لديك فئة مثل هذا (ملاحظة: لم أكتب هذا مع IDE، لذلك قد لا يكون الرمز صحيحا نصنيا):

public class Property {
@ManyToMany
private List<Image> images;
}

public class Image {
@ManyToMany
private List<Property> properties;
}

لذلك استعلام مثل select property from Property property يجب أن تحصل على قائمة الخصائص، والتي يمكنك الوصول إليها من خلال خصائص Java العادية.

هل هذا ما تبحث عنه، أم أن أسيء فهمه؟

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