我对表格和关系表有疑问...
实际上,我有这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,...”)中这不是更好吗?
谢谢你们;)
答案 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
);
只需在它们之间创建外键关系。
如果您尝试将此作为显式关系,则会有大量冗余数据。
这是更好的方法。您也可以将该外键设为索引。这样在搜索操作期间数据库检索变得很快。
希望这会有所帮助..
注意:不确定外键的确切语法