Ne mysql tablo yapısı bu durumda kullanmak için

2 Cevap php

Kullanıcıların çok çeşitli özelliklerini oluşturmak ve mülkiyet ile ilgili birçok özelliği ile bir gayrimenkul web sitesi için databse yapısını yapmak gerekir.

The main categories will be: 1. House (subtype apartment, house, loft) 2. Commercial (subtype: hotels, buildings, offices, factory) 3. Terrains (subtype: urban, agricola, industrial, for sports)

Işık, gaz, odalar arasında, banyo, kat sayısı, balkon, ve benzeri, ve bu özellikleri başka bir mülkiyet türü diferent: Yukarıda tüm bu örnek için tanımlanmış birçok özellik, bir daire olabilir.

Şu anda ben property adres ve fiyat gibi temel bilgileri içeren adında bir ana tablo var, ve üç subtables property_house, property_commercial, ve {[(3) }] gibi birçok alanları ile bir özellik özellikleri gibi olabilir.

Bu yapı, tamam mı? Ben 3-4 adımlarla belki bir forma tüm Gayrimenkul türleri oluşturma ve değişiklik yapmak gerekir ve başka bir özellik türü farklı olacaktır. Ben sadece bir ana property gibi bir tablo ve bir saniye property_features burada property_id, FEATURE_NAME saklamak ve FEATURE_VALUE varsa daha kolay olacak? Ne performans ve bakımı için en iyi? Ne insanlar için oy vereceğini?

Teşekkür ederiz! :)

2 Cevap

Ben size bahsettiğim iki yönden deneyimi var. (Ben iRealty http://www.irealtysoft.com/ ver 3 co-geliştirici yaşıyorum. Ve 4 ver iki farklı depolama yöntemleri var). Her iki yönde ile ilgili birkaç yıl sonra tüm özellikleri için tek bir tablo oluşturmak için tavsiye. Bu desen Tek tablo Kalıtım (http://martinfowler.com/eaaCatalog/singleTableInheritance.html Martin Fowler tarafından) denir.

Bu yöntemin dezavantajı, sadece iki Bak:

  1. alan adları tüm özellik türleri içinde benzersiz olmalıdır
  2. kayıtları bir sürü hakkında bunların sütun sahip olan atıklar disk alanı içinde biraz NULL olacak

A aynı zamanda bu veritabanı yapısı ile tüm CRUD rutinleri çok basit ve açıktır. Siz zaman bina sorgular / ORM katman bir çok kazandıracak. Bu yapı ile dizin oluşturmak ve aritmetik ve diğer veritabanı işlevleri kullanmak maddelerinde WHERE ve JOIN pahalı önlemek için ücretsizdir.

Disk alanı geliştirme zamanı pahalı, ucuz.

| Property_id | FEATURE_NAME | FEATURE_VALUE | alanları ve Gayrimenkul türleri değiştirirken karmaşık bir güncelleme / yükseltme rutin olduğunda iyi olduğu, aynı veritabanı yapısını korumak için olanak sağlar. Eğer bir tek (üretim) örnek uygulama oluşturmak için gidiyoruz eğer yükseltmeleri bir sorun olmamalı. Ancak bu yöntem REZİL modeli karmaşık ve dolayısıyla daha pahalı ve hata eğilimli olun. (Daha fazla kod --- daha fazla hata.)

Peki, bu üç ana kategoride taş ayarlanır? Gelecekte kadar kırpma dördüncü birinin bir olasılık var mı? Herhalde böyle bir şey ile devam ediyorum:

CREATE TABLE property (
    id int not null auto_increment,
    name varchar(250) not null,
    property_type int not null,
    property_subtype int not null,
    primary key(id)
);
CREATE TABLE property_type (
    id int not null auto_increment,
    name varchar(250) not null,
    primary key(id)
);
CREATE TABLE property_subtype (
    id int not null auto_increment,
    type int not null,
    name varchar(250) not null,
    primary key(id)
);
CREATE TABLE property_feature (
    id int not null auto_increment,
    property int not null,
    feature int not null,
    value varchar(250) not null,
    primary key(id)
);   
CREATE TABLE property_feature (
    id int not null auto_increment,
    feature int not null,
    value varchar(250) not null,
    primary key(id)
);

Zaman geliyor - ne zaman - Ben bu uzun vadede ve eğer en esnek en etkili olacağını düşünüyorum.

Bu yapı ile, sonra bu gibi veri ekleyebilirsiniz:

mysql> INSERT INTO property_type (name) VALUES ('House'),('Commercial'),('Terrains');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> INSERT INTO property_subtype (type, name) VALUES (1, 'Apartment'),(1, 'House'), (1,'Loft');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> INSERT INTO subtype_feature (subtype, name) VALUES (1, 'Light'),(1, 'Floor #');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO property (name, property_type, property_subtype) VALUES ('Som
e Apartment', 1, 1);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO property_feature (feature, value) VALUES (1, 'Yes'),(2, '5th');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO property_feature (property, feature, value) VALUES (1, 1, 'Yes'),(1, 2, '5th');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

Daha sonra oldukça kolay, belirli bir özelliği tüm özellikleri elde edebilirsiniz:

mysql> SELECT s.name, f.value FROM property_feature f INNER JOIN subtype_feature
 s ON f.feature = s.id WHERE f.property = 1;
+---------+-------+
| name    | value |
+---------+-------+
| Light   | Yes   |
| Floor # | 5th   |
+---------+-------+
2 rows in set (0.00 sec)