在基于SQL的应用程序中自行记录“代码”的最佳方法是什么?

时间:2012-01-05 18:45:49

标签: sql enums

问:有没有办法在“标准SQL”中实现自我记录的枚举?

   EXAMPLE:
   Column: PlayMode
   Legal values: 0=Quiet, 1=League Practice, 2=League Play, 3=Open Play, 4=Cross Play

我一直在做的只是将字段定义为“char(1)”或“int”,并将助记符(“联盟练习”)定义为代码中的注释。

任何更好的建议?

我绝对更喜欢使用标准SQL,因此数据库类型(mySql,MSSQL,Oracle等)无关紧要。我也更喜欢使用任何应用程序语言(C,C#,Java等),因此编程语言也无关紧要。

非常感谢你!

PS: 我的理解是使用第二个表 - 将代码映射到描述,例如“table playmodes(char(1)id,varchar(10)name)” - 非常昂贵。这一定是正确的吗?

4 个答案:

答案 0 :(得分:4)

通常的方法是使用静态查找表,有时称为“域表”(因为它的目的是限制列变量的域。)

由您来保持任何枚举等的基础值与数据库中的值保持同步(您可以编写代码生成器来生成域表中的枚举,该域在域中的某些内容时会被调用表变了。)

以下是一个例子:

--
-- the domain table
--
create table dbo.play_mode
(
  id          int         not null primary key clustered ,
  description varchar(32) not null unique nonclustered   ,
)

insert dbo.play_mode values ( 0 , "Quiet"          )
insert dbo.play_mode values ( 1 , "LeaguePractice" )
insert dbo.play_mode values ( 2 , "LeaguePlay"     )
insert dbo.play_mode values ( 3 , "OpenPlay"       )
insert dbo.play_mode values ( 4 , "CrossPlay"      )

--
-- A table referencing the domain table. The column playmode_id is constrained to
-- on of the values contained in the domain table playmode.
--
create table dbo.game
(
  id          int not null primary key clustered ,
  team1_id    int not null foreign key references dbo.team(      id ) ,
  team2_id    int not null foreign key references dbo.team(      id ) ,
  playmode_id int not null foreign key references dbo.play_mode( id ) ,
)
go

有些人出于“经济”的原因可能会建议对所有这些代码使用单一的全部表格,但根据我的经验,这最终会导致混淆。最佳实践是针对每组离散值的单个小表。

答案 1 :(得分:2)

将“外键”添加到“代码”表中。

代码表将PK作为代码值,添加一个字符串描述列,您在该值的描述中输入。

table: PlayModes

Columns: PlayMode     number  --primary key
         Description  string

我不能将其视为very expensive,数据库基于这样的表连接。

答案 2 :(得分:1)

该信息应该在某个地方而不是评论中。

所以,你应该有一个包含那些代码的表格,并在你的桌子上增加一个FK。

答案 3 :(得分:1)

我同意@Nicholas Carey(+1):具有两列的静态数据表,例如“Key”或“ID”和“Description”,使用代码对所有表进行外键约束。通常,ID列是简单的代理键(1,2,3等,没有附加值的值),但在合理的情况下,我更进一步使用“特殊”代码。以下是一些例子。

如果值是序列(例如,有序,付费,已处理,已发货),我可能会使用1,2,3,4来表示序列。如果您想要找到所有“直到”给定阶段,例如所有尚未发货的订单(ID< 4),这可以使事情变得更容易。如果您要提前计划,请将它们分别为10,20,30,40;如果/当新代码或状态出现时,这将允许您在现有值之间添加值。 (是的,你不能也不应该试着预测一切可能必须在某天完成的事情,但是像这样的一些预先计划可以使一些变化更加简单。)

Keys / Ids通常是整数(1个字节,2个字节,4个字节,无论如何)。制作角色值的成本很低(1个字符,2个char,3个,char,4个字符)。那是字符,而不是变量字符。通过这种方式,您可以在代码上使用助记符,例如

  • O,P,R,S
  • 或,Pd,Pr,Sh
  • Ordr,Paid,Proc,Ship

......或者你的船漂浮的任何东西。通过这种方式,我发现在分析或调试时可以节省大量时间。您仍然需要查找表,关系完整性以及更隐蔽代码的提醒。