如何将基表与其特定的角色变体表连接?

时间:2014-07-28 09:33:57

标签: sql database-design

您好我正在为房地产开发一个小型网站,我想为它设计一个数据库。我已实现用户注册,但我希望用户选择一个或多个角色。更具体地说,用户可以是销售购买房屋或两者的人。因此,对于每个用户类型,我希望拥有一个包含其属性的表。我的问题是我不知道如何将用户与属性联系起来。到目前为止,我有这些表:

User:
varchar userid;
varchar password;
varchar registrationDate;

Buyer:
varchar id;
varchar housesBought;

Seller
varchar id;
varchar rating;
varchar housesSold;

不知何故,我需要连接这些实体,但到目前为止,我找不到任何好的做法。任何指南或解决方案将不胜感激。 Thx提前

3 个答案:

答案 0 :(得分:2)

你没有说你正在使用什么数据库,但我猜它可能是MySql?无论如何,以下原则几乎适用于任何关系数据库包(MS Access,SQL Server,PostGres等)

对于与用户表有关系的任何表,您需要有一个“外键”,这是一个与另一个表相关的字段。例如,采取您的设计:

User
int id;
varchar user_type;
varchar password;
varchar registrationDate;

Buyer:
int id;
int user_id;
varchar housesBought;

Seller
int id;
int user_id;
varchar rating;
varchar housesSold;

请注意,我已将主键(id字段)更改为整数。您不应该将varchar用于数值数据,因为它在索引时非常低效。

user_id字段链接到User表的id字段。

但是,我实际上会推荐一种不同的设计。您的设计与买家和卖家属性的单独表格有一些限制。例如,如果有人同时是买方和卖方,那么您将数据存储在两个不同的位置,这在这个简单的示例中是不必要的。此外,我们在用户表和其他两个表之间定义的关系是一对一的关系。对于任何给定的用户,每个表中始终只有一条记录。这意味着您可能最好只将所有信息存储在一个表中。

通常在关系数据库设计中,我们使用1对多关系作为分区和链接数据的有效方式。例如,假设您有一个存储用户地址的表。每个用户可以有多个地址,所以我们有这样的事情:

Address
int id;
int user_id;
bool is_default_address;
varchar address_line1;
varchar address_line2;
varchar county;
varchar postcode;

因为每个用户可以拥有多个地址,所以这是一对多的关系,使用外键user_id链接表。

现在,我的最终建议是彻底检查您的数据库设计,以摆脱这些一对一的关系。我建议你这样做:

User:
int userid;
varchar password;
varchar registrationDate;
int rating;
int housesSold;
int housesBought;


Property
int id;
int seller_id;
int buyer_id;
varchar description;
varchar address;
varchar postcode;
decimal price;

现在您将所有用户详细信息存储在一个表中 - 是的,它有少量冗余,但它更灵活,更容易检索您需要的数据,而您的网站不必进行必要的表连接。

Property表中的字段seller_id和buyer_id都是链接到User.id字段的外键。然后,您的Web应用程序可以计算指向特定用户的链接数,并使用它来自动填充用户表中的housesSold和housesBought字段。

关系数据库设计是一个很大的主题,所以我只是略微表面,但我希望这些足以让你前进。值得投资一本好书,也许是你选择的数据库平台的相关O'Reilly书。

答案 1 :(得分:0)

在表Buyer中,您可以拥有一个user_id列,该列将成为表User的用户ID的外键。 所以     买方:     varchar id;     varchar housesBought;     varchar user_id;

同样适用于卖家

答案 2 :(得分:0)

已经说过,您可以使用外键将买家和卖家表格链接到他们所代表的用户。作为一个小改进,我可以建议您使用user_id作为sellerbuyer表的主键,同时它是外键。

User:
int userid; (Primary Key)
varchar password;
varchar registrationDate;

Buyer:
int user_id; (Primary Key, ForeignKey to User(userid))
varchar housesBought;

Seller
int user_id; (Primary Key, ForeignKey to User(userid))
varchar rating;
varchar housesSold;

它将保证没有用户可以拥有两个卖家(买家)"账户"并删除不必要的主键。

这就是所谓的identifying relationship

Thisthis可以显示有关如何在DDL中实现此类关系的技术详细信息。

P.S。:Don't store passwords as plain text