关系表的最佳方式

时间:2013-11-20 14:23:56

标签: mysql sql

我对表格和关系表有疑问...
实际上,我有这3个表

CREATE TABLE USER (
  ID int(11) NOT NULL AUTO_INCREMENT,
  NAME varchar(14) DEFAULT NULL
);

CREATE TABLE COUNTRY (
  ID int(11) NOT NULL AUTO_INCREMENT,
  COUNTRY_NAME varchar(14) DEFAULT NULL
);

CREATE TABLE USER_COUNTRY_REL (
  ID int(11) NOT NULL AUTO_INCREMENT,
  ID_USER int(11) NOT NULL,
  ID_COUNTRY int(11) NOT NULL,
);

好的,现在,1个用户可以拥有一个或多个国家/地区,因此,一个用户的表USER_COUNTRY_REL中有多个条目。
但是,我的表USER包含近130,000个条目......
即使是按用户划分的1个国家/地区,USER_COUNTRY_REL表也几乎是10Mo 我有几种相关的表格......

我的问题是,这是最快,更好的方法吗?

直接放在包含不同ID的USER表,COUNTRY字段(如下:“2,6,...”)中这不是更好吗?

谢谢你们;)

2 个答案:

答案 0 :(得分:1)

就时间限制而言,你拥有它的方式是最优的。当然,它占用更多空间,但这是space-time tradeoff的一部分 - 如果你想要更快,你会占用更多空间;如果你想使用更少的空间,它将运行得更慢(平均而言)。

另外,想想未来。现在,您可能正在为每个用户选择国家/地区,但只是等待。由于范围蔓延的魔力,您的应用程序有一天需要选择给定国家/地区的所有用户,此时扫描每个用户的“COUNTRY”字段以查找匹配将非常缓慢,而不是仅仅向后通过USER_COUNTRY_REL表就像你现在可以做的那样。

通常,对于1对1或1对多的关联,您可以通过外键进行链接。对于多对多关联,您希望在两者之间建立关系表。此方案是多对多关系,因为每个用户都有多个国家/地区,并且每个国家/地区都有多个用户。

答案 1 :(得分:0)

为什么不尝试这样:首先创建表国家

CREATE TABLE COUNTRY (
  CID int(11) NOT NULL AUTO_INCREMENT,
  COUNTRY_NAME varchar(14) DEFAULT NULL
);

Then the table user:

CREATE TABLE USER (
  ID int(11) NOT NULL AUTO_INCREMENT,
  NAME varchar(14) DEFAULT NULL,
  CID Foreign Key References CID inCountry
);

只需在它们之间创建外键关系。

如果您尝试将此作为显式关系,则会有大量冗余数据。

这是更好的方法。您也可以将该外键设为索引。这样在搜索操作期间数据库检索变得很快。

希望这会有所帮助..

注意:不确定外键的确切语法