在这种情况下使用什么mysql表结构

时间:2009-06-01 07:38:58

标签: php mysql database-design

我需要为房地产网站制作数据库结构,用户可以在其中创建多种类型的属性,并具有与该属性相关的许多功能。

主要类别是: 1.房子(子公寓,房子,阁楼) 2.商业(子类型:酒店,建筑物,办公室,工厂) 3.地形(子类型:城市,农业,工业,体育)

以上所有内容都可以定义许多功能,例如公寓:灯光,煤气,房间数量,浴室,楼层数,阳台等等,这些功能在不同的房产类型之间是不同的。

目前,我有一个名为property的主表,其中包含地址和价格等基本信息,以及三个子表property_houseproperty_commercialproperty_terrain。字段作为属性可以具有的功能。

这个结构好吗?我需要将所有属性类型的创建和修改分成一个形式,可能有3-4个步骤,并且将从一个属性类型到另一个属性类型不同。如果我只有一个像property和第二个property_features这样的主表来存储property_id,feature_name和feature_value会更容易吗?什么是最好的性能和维护?你们会投票给谁?

谢谢! :)

2 个答案:

答案 0 :(得分:2)

我对你提到的两种方式都有经验。 (我是iRealty http://www.irealtysoft.com/ ver 3的共同开发者,而ver 4有两种不同的存储方法)。经过几年处理这两种方式后,我建议为所有属性创建一个表。这种模式称为单表继承(Martin Fowler的http://martinfowler.com/eaaCatalog/singleTableInheritance.html)。

我认为这种方法只有两个缺点:

  1. 字段名称在所有属性类型中应该是唯一的
  2. 很多记录在其列的内容中会有NULL,这会浪费磁盘空间
  3. 与此数据库结构同时,所有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)