假设我有一个具有状态的用户,用户的状态可以是“活动的”、“暂停的”或“非活动的”。
现在,在创建数据库的时候,我在想.如果使用字符串值(使用枚举类型或应用规则)的列更好,那么查询和了解当前用户状态更容易,或者更好地连接,我应该加入一个包含可能的用户状态的UserStatuses表吗?
假设,应用程序用户当然不能创建状态。
编辑:澄清
发布于 2013-11-13 13:44:37
在大多数系统上,它对性能几乎没有影响。就我个人而言,为了清晰起见,我会使用一个短字符串,并按照您的建议将其加入到一个包含更多细节的表中。
create table intLookup
(
pk integer primary key,
value varchar(20) not null
)
insert into intLookup (pk, value) values
(1,'value 1'),
(2,'value 2'),
(3,'value 3'),
(4,'value 4')
create table stringLookup
(
pk varchar(4) primary key,
value varchar(20) not null
)
insert into stringLookup (pk, value) values
(1,'value 1'),
(2,'value 2'),
(3,'value 3'),
(4,'value 4')
create table masterData
(
stuff varchar(50),
fkInt integer references intLookup(pk),
fkString varchar(4)references stringLookup(pk)
)
create index i on masterData(fkInt)
create index s on masterData(fkString)
insert into masterData
(stuff, fkInt, fkString)
select COLUMN_NAME, (ORDINAL_POSITION %4)+1,(ORDINAL_POSITION %4)+1 from INFORMATION_SCHEMA.COLUMNS
go 1000
这将导致300 K行。
select
*
from masterData m inner join intLookup i on m.fkInt=i.pk
select
*
from masterData m inner join stringLookup s on m.fkString=s.pk
在我的系统( Server)上-查询计划、I/O和CPU是相同的-执行时间是相同的。-只读取和处理一次查找表(在这两个查询中)
使用int或string没有的区别。
发布于 2013-11-13 14:30:34
我认为,作为一个整体,每个人都找到了你问题答案的重要组成部分。但是,它们都有好的方面,应该放在一起,而不是分开。
希望这能有所帮助!
克里斯托弗
发布于 2013-11-13 13:56:19
标准化背后的整个想法是防止数据重复(至少有一个概念)。
在这种情况下,用户一次只能拥有1种状态(我假设),所以他们没有理由将其放在自己的表中。你只会把事情复杂化。如果由于某种原因,这些状态不是静态的,那么您将有一个独立的表的唯一原因。意思是下个月你可以加上“有点活跃”和“可能不活跃”。这意味着,如果您没有将代码放在自己的表中,则需要更改代码以弥补这一点。您可以创建一个维护页面,用户可以在其中添加状态,然后需要创建一个独立的表。
https://stackoverflow.com/questions/19964943
复制相似问题