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)” - 非常昂贵。这一定是正确的吗?
答案 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个字符)。那是字符,而不是变量字符。通过这种方式,您可以在代码上使用助记符,例如
......或者你的船漂浮的任何东西。通过这种方式,我发现在分析或调试时可以节省大量时间。您仍然需要查找表,关系完整性以及更隐蔽代码的提醒。