多行或一列[sql性能]

多行或一列[sql性能],sql,performance,reddit,Sql,Performance,Reddit,我正在为这个简单的想法而挣扎。 看看reddit,当你注册一个新帐户时。。您可以自动订阅某些默认频道 我想对我的网站做同样的事情 我知道我可以用id,user\u id,chan\u id做简单而愚蠢的user\u chan 如果成龙是这样的: ID | NAME 1 | videos 2 | pictures 用户_chan会是这样的(我是用户1) 我想说得很清楚:D 我想这就是reddit的工作原理。但每次用户注册时,必须插入十几行。我猜他们有很多用户 那么,像这样的用户表中的解决方案

我正在为这个简单的想法而挣扎。 看看reddit,当你注册一个新帐户时。。您可以自动订阅某些默认频道

我想对我的网站做同样的事情

我知道我可以用id,user\u id,chan\u id做简单而愚蠢的user\u chan

如果成龙是这样的:

ID | NAME
1  | videos
2  | pictures
用户_chan会是这样的(我是用户1)

我想说得很清楚:D

我想这就是reddit的工作原理。但每次用户注册时,必须插入十几行。我猜他们有很多用户

那么,像这样的用户表中的解决方案更聪明吗

ID | USER_NICKNAME | CHANS
1  | me            | 1,2

不要使用一列存储多个值。这是一种非规范化,以后会引起疼痛。例如,当您需要查询哪个用户有频道3时,您将不得不像使用一样使用,这将导致性能不佳。当您只需要删除用户拥有的多个频道中的一个时,它会变得更加困难

对于大多数数据库,您可以使用一条
insert
语句插入多行。确切的语法因平台而异;在SQL Server中,可以执行以下操作:

insert into user_chan
(USER_ID, CHANID)
select 7634, 3
union all
select 7634, 27
union all
select 7634, 9

不要使用一列存储多个值。这是一种非规范化,以后会引起疼痛。例如,当您需要查询哪个用户有频道3时,您将不得不像使用一样使用,这将导致性能不佳。当您只需要删除用户拥有的多个频道中的一个时,它会变得更加困难

对于大多数数据库,您可以使用一条
insert
语句插入多行。确切的语法因平台而异;在SQL Server中,可以执行以下操作:

insert into user_chan
(USER_ID, CHANID)
select 7634, 3
union all
select 7634, 27
union all
select 7634, 9

或者,按照您的建议,使用XML列存储多个值。它可以有一个XML索引,可以像查询/更新关系表一样进行查询/更新(尽管语法更复杂)。

或者,按照建议使用XML列存储多个值。这可以有一个XML索引,可以像查询/更新关系表一样进行查询/更新(尽管语法更复杂)。

哇,我没有想到“什么时候需要查询哪个用户有通道3”。正确的。这就是告诉我选择解决方案1+1的情况,如果你发现自己使用了部分列,你就做错了。每行函数的伸缩性不好。您查询此数据库的频率将远远超过向其写入数据的频率。相应地计划。我甚至怀疑是否需要一个insert语句。交易也会做同样的事情,而且不会经常发生问题。哇,我没有想到“什么时候你需要查询哪个用户有频道3”。正确的。这就是告诉我选择解决方案1+1的情况,如果你发现自己使用了部分列,你就做错了。每行函数的伸缩性不好。您查询此数据库的频率将远远超过向其写入数据的频率。相应地计划。我甚至怀疑是否需要一个insert语句。事务也会做同样的事情,而且做得不够频繁,不会引起问题。