أفضل الممارسات في الاستعلام عن جدول البحث

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

  •  06-07-2019
  •  | 
  •  

سؤال

وأنا أحاول أن يجدوا طريقة الاستعلام الجدول المنشأة السياحية من البحث.

ولدي جدول الممتلكات التي تحتوي على معلومات استئجار العقارات (عنوان، والإيجار، وديعة، # من غرف النوم، الخ) جنبا إلى جنب مع جدول آخر (Property_Feature) الذي يمثل ملامح هذا العقار (تجمع، تكييف الهواء، والغسيل على- الموقع، الخ). الميزات التي تعرف نفسها في بعد الجدول المسمى ميزة أخرى.

Property
    pid - primary key
    other property details

Feature
    fid - primary key
    name
    value

Property_Feature
    id - primary key
    pid - foreign key (Property)
    fid - foreign key (Feature)

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

وشكرا للمساعدة والبصيرة.

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

المحلول

في مجال تصميم قواعد البيانات، لك هو الطريق الصحيح لتحقيق ذلك. انها تطبيع بشكل صحيح.

لالاستعلام، وأود أن مجرد استخدام موجودا، مثل هذا:

select * from Property
where 
exists (select * from Property_Feature where pid = property.pid and fid = 'key_air_conditioning')
and
exists (select * from Property_Feature where pid = property.pid and fid = 'key_pool')

وأين key_air_conditioning وkey_pool من الواضح أنها مفاتيح لتلك الميزات.

والأداء سيكون موافق حتى بالنسبة لقواعد البيانات الكبيرة.

نصائح أخرى

إليك الاستعلام الذي سوف تجد كافة الخصائص مع بركة:

select
    p.*
from
    property p
    inner join property_feature pf on
        p.pid = pf.pid
    inner join feature f on
        pf.fid = f.fid
where
    f.name = 'Pool'

وأنا استخدم الداخلية ينضم بدلا من EXISTS لأنه يميل إلى أن يكون أسرع قليلا.

ويمكنك أيضا القيام بشيء من هذا القبيل:

  SELECT * 
    FROM Property p
   WHERE 3 =
         ( SELECT COUNT(*)
             FROM Property_Feature pf
                , Feature f
            WHERE pf.pid = p.pid
              AND pf.fid = f.fid
              AND f.name in ('air conditioning', 'pool', 'laundry on-site')
         );

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

وقارن ذلك، والأداء الحكمة، لبناء tekBlues أعلاه؛ اعتمادا على توزيع البيانات الخاصة بك، أي واحد من هؤلاء قد يكون الاستعلام أسرع.

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