2011-08-23 66 views
2

有一个父表,并与像外键子表时,我在想:SQL查询加入建议

users 
id | username | password | 

users_blog 
id | id_user | blog_title 

是确定使用id作为自动增量也连接表(users_blog),否则我将有查询速度问题?

另外我想知道哪些字段添加为PRIMARY,哪些作为索引在users_blog表中?

希望的问题是明确的,对不起我的英文不好:P

+0

@guys什么我忘了告诉大约是id_user为1对多的关系(所以在需要时与用户ID我将加盟),并且我还会指定user_blog表中的id auto_increment用于仅分页user_blog表。 – sbaaaang

回答

2

我不认为你实际上需要users_blog表中的id列。我会让id_user成为该表的主索引,除非您有另外的理由这样做(也许users_blog表实际上有更多列,而您只是没有向我们展示它)。

就性能而言,在users_blog表中具有id列不应该影响性能本身,但您的查询永远不会使用此索引,因为您很可能不会选择基于该列的数据。将id_user列作为主索引实际上对您有利,并且会加速您的连接和选择。

2

什么是用户和user_blog之间的基数?如果它是1:1,为什么在user_blog表中需要id字段?

+0

对不起,我忘记告诉基数是1到很多不是1:1。 – sbaaaang

1

我在users_blog上看不到有自动增量id列的问题。

主键可以是id_user, id。至于索引,这很大程度上取决于您的使用情况。

我怀疑你会与博客引擎有任何数据库相关的性能问题,所以索引或不索引没有太大的区别。

1

您不必在users_blog表中使用id列,您可以将id_user与users表一起加入。也自动增量是不是性能问题

-1
  • 这是一个好主意,有一个标识符列是自动增量 - 这保证了一种唯一标识行的方式(如果所有其他列是相同的两行)
  • id是所有表键一个好听的名字,它的标准
  • <table>_id适用于外键的标准名称 - 在你的情况下使用user_id(不id_user你有)
  • MySQL的自动创建索引定义为主键或外键的列 - 在那里没有必要做任何事情在这里
  • 恕我直言,表名应该是单数 - 即userusers

你SQL应该是这个样子:

create table user (
    id int not null auto_increment primary key, 
    ... 
); 

create table user_blog (
    id int not null auto_increment primary key, 
    id_user int not null references user, 
    ... 
); 
+0

“这是一个好主意,它有一个标识符列...保证一种唯一标识行的方式(如果所有其他列对于两行都是相同的)” - 因此两个不同的用户可以使用相同的“用户名'和'密码'组合,当他们中的一个登录时,他们可以访问其他人的账户?这并不意味着我是个好主意。 – onedaywhen

+0

如果您的要求是其他列集也是*唯一的,那么在它们上定义一个唯一的索引。我在谈论更多有关两次发生的相同数据,这不是问题 - 例如,您只想选择要删除的数据。 – Bohemian

+0

正在讨论的案例有列'username'和'password':什么时候在这个表中复制'username'是一个好主意?我说永远不会,因此建议在此表中使用'username'作为唯一的关​​键。 – onedaywhen

2

是确定使用ID作为自动递增也在连接表(users_blog) 或我会有问题的查询速度?

字段是否自动递增不会影响您检索数据库中已有数据的速度。

也是我想知道哪些字段添加为主要和其在users_blog表 INDEX?

PRIMARY KEY(和其他约束)的目的是强制数据的正确性。索引对于性能而言“仅仅”。

所以场将在PRIMARY KEY什么取决于你希望与您的数据模型来表达:

  • 如果users_blog行标识单独的id(即有一个“非身份”这两个表之间的关系),将id单独放在PRIMARY KEY中。
  • 如果通过id_userid(又名“识别”关系)的组合来识别它,那么您将在PK中将这两个字段放在一起。

作为索引,这取决于您将如何访问您的数据。例如,如果您执行多个JOIN,则可以使用考虑id_user上的索引。

索引性能产生很好的教程,可以发现:

http://use-the-index-luke.com