【问题标题】:What the best way to self-document "codes" in a SQL based application?在基于 SQL 的应用程序中自我记录“代码”的最佳方式是什么?
【发布时间】:2012-01-06 03:39:40
【问题描述】:

问:有没有办法在“标准 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: 我的理解是使用第二个表 - 将代码映射到描述,例如“表播放模式(char(1)id,varchar(10)名称)” - 非常昂贵。这一定是正确的吗?

【问题讨论】:

标签: sql enums


【解决方案1】:

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

您可以将任何枚举等的基础值与数据库中的值保持同步(您可以编写一个代码生成器来从域表中生成枚举,当域中的某些东西被调用时表已更改。)

这是一个例子:

--
-- 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,数据库是基于这样的连接表的。

【讨论】:

    【解决方案3】:

    这些信息应该在数据库中的某个地方,而不是在 cmets 上。

    因此,您应该有一个包含该代码的表格,并在您的表格上为它添加一个 FK。

    【讨论】:

      【解决方案4】:

      我同意@Nicholas Carey (+1) 的观点:静态数据表有两列,比如“Key”或“ID”和“Description”,所有使用代码的表都有外键约束。通常 ID 列是简单的代理键(1、2、3 等,对值没有任何意义),但在合理的情况下,我会更进一步并使用“特殊”代码。以下是几个例子。

      如果值是一个序列(例如,Ordered、Paid、Processed、Shipped),我可能会使用 1、2、3、4 来表示序列。如果您想找到所有“通过”给定阶段,例如所有尚未发货的订单(ID

      键/ID 通常是整数(1 字节、2 字节、4 字节等)。使它们成为字符值(1 char、2 char、3、char、4 char)几乎没有成本。那是字符,而不是可变字符。这样一来,你的代码就可以有助记词了,比如

      • O、P、R、S
      • Or、Pd、Pr、Sh
      • Ordr、Paid、Proc、Ship

      ……或者任何漂浮在你船上的东西。这样做,我发现它可以在分析或调试时节省大量时间。您仍然需要查找表,以确保关系完整性以及提醒更晦涩的代码。

      【讨论】:

      • +1 表示“域表”+“助记符”的概念。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多