أفضل الممارسات في الاستعلام عن جدول البحث
-
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 أعلاه؛ اعتمادا على توزيع البيانات الخاصة بك، أي واحد من هؤلاء قد يكون الاستعلام أسرع.