我需要为房地产网站制作数据库结构,用户可以在其中创建多种类型的属性,并具有与该属性相关的许多功能。
主要类别是: 1.房子(子公寓,房子,阁楼) 2.商业(子类型:酒店,建筑物,办公室,工厂) 3.地形(子类型:城市,农业,工业,体育)
以上所有内容都可以定义许多功能,例如公寓:灯光,煤气,房间数量,浴室,楼层数,阳台等等,这些功能在不同的房产类型之间是不同的。
目前,我有一个名为property
的主表,其中包含地址和价格等基本信息,以及三个子表property_house
,property_commercial
和property_terrain
。字段作为属性可以具有的功能。
这个结构好吗?我需要将所有属性类型的创建和修改分成一个形式,可能有3-4个步骤,并且将从一个属性类型到另一个属性类型不同。如果我只有一个像property
和第二个property_features
这样的主表来存储property_id,feature_name和feature_value会更容易吗?什么是最好的性能和维护?你们会投票给谁?
谢谢! :)
答案 0 :(得分:2)
我对你提到的两种方式都有经验。 (我是iRealty http://www.irealtysoft.com/ ver 3的共同开发者,而ver 4有两种不同的存储方法)。经过几年处理这两种方式后,我建议为所有属性创建一个表。这种模式称为单表继承(Martin Fowler的http://martinfowler.com/eaaCatalog/singleTableInheritance.html)。
我认为这种方法只有两个缺点:
与此数据库结构同时,所有CRUD例程都非常简单明了。您将节省大量时间来构建查询/ ORM层。使用此结构,您可以自由地创建索引并在WHERE子句中使用算术和其他数据库函数,并避免代价高昂的JOIN。
磁盘空间便宜,开发时间很长。
| property_id | feature_name | feature_value |允许在更改字段和属性类型时保持相同的数据库结构,这在具有复杂的升级/更新例程时很好。如果要构建单个(生产)实例应用程序,则升级不应成为问题。然而,这种方法使CRUD模型复杂,因此更昂贵且容易出错。 (更多代码---更多错误。)
答案 1 :(得分:0)
嗯,这三个主要类别是否一成不变?是否有可能在未来出现第四个?我可能会用这样的东西:
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)
);
我认为从长远来看这将是最有效的,如果 - 时间到了,这将是最灵活的。
使用此结构,您可以添加如下数据:
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
然后,您可以非常轻松地获取特定属性的所有功能:
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)