2017-05-04 16 views
1

我想知道如果它是更好的(主观我知道)存储整数值或字符串的值,当字段只有一组可能值。例如。SQL Store varchar或int当我只有一组值时

Person Table 
1. 
Name Age Category 
Joe 25 0 
Jane 28 2 
John 22 1 

2. 
Name Age Category 
Joe 25 Student 
Jane 28 Teacher 
John 22 Staff 

哪种方法是可取的?方法1可能更快且更好地进行查询,但是,显示数据时,编程成本更高。方法2可能更慢,更富表现力,编程成本更低。

任何意见将是有益的。

在此先感谢

+0

而且一个研究生不能教? – jarlh

回答

5

此使用对照表,与类别,以及用于链接表的整数你会一般都这样。

的参照表具有多个优点:

  • 可能值的列表可在一个地方。例如,这对于在应用程序中生成列表很方便。
  • 没有拼写错误。
  • 您可以存储其他信息,例如短名称,长描述,敬语等。
  • 如果您需要多语言支持,则可以将所有值存储在一个地方。
  • 可以在多个表中共享相同的值。

有时候,参考表并不合适。例如,您可能只有两个值,ONOFF。您可以在大多数数据库中使用CHECK CONSTRAINT验证值。这是一个合理的选择。但我怀疑这个类别的信息不仅仅是一小部分的价值。

+0

感谢您的意见和建议。选项1是首选 – Dudedolf

0

也许你正在寻找一个简单的响应,但是,我想分享我的方法, 我有一个名为CustomCaptions的表。 你可以在这里找到表格的结构。

CREATE TABLE [dbo].[CustomCaptions](
[Capt_ID] [int] IDENTITY(1,1) NOT NULL, 
[Capt_Code] [varchar](50) NULL, 
[Capt_Family] [varchar](50) NULL, 
[Capt_FR] [nvarchar](100) NULL, 
[Capt_EN] [nvarchar](100) NULL, 
[Capt_ES] [nvarchar](100) NULL, 
[Capt_IT] [nvarchar](100) NULL, 
[Capt_TR] [nvarchar](100) NULL, 
[Capt_CS] [nvarchar](100) NULL, 
[Capt_DE] [nvarchar](100) NULL, 
[Capt_Deleted] [bit] NULL, 
[Capt_Order] [smallint] NULL, 
CONSTRAINT [PK_CustomCaptions] PRIMARY KEY CLUSTERED 
(
[Capt_ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

Capt_Family列是您的外部列的名称。

就你的情况而言,在CustomCaptions表中,我保留了代码和家庭。 对于为例,

 Capt_Family  Capt_Code  Capt_EN ... Capt_Order 
     Category  0    Student  0 
     Category  1    Teacher  1 
     Category  2    Staff  2 

这样的,像类别,状态,类型等所有的小桌......我只用一个表,这降低了我的数据库表中的总数。 此外,我只有一种方法通过只给出姓氏来填充组合框或列表框。并且也只有一个屏幕来编辑任何列表的内容。

而且正如您在表格结构中看到的那样,您可以在应用程序中轻松管理多种语言。 根据您的需要,您可以使用Capt_EN或另一列作为其他语言。

最后,如果您愿意,您可以创建视图来降低编程成本。

我希望这会有所帮助。

+0

对于多个实体使用单个查找表通常被认为是不好的做法。如果你的项目足够小,你可能会摆脱它,但它最终有可能导致问题。 – Jerrad

+0

嗨jerrad,感谢您的评论。该系统用于拥有超过5百万用户的产品中。可能这不是最好的做法,但是这个系统有很多优点。特别是,如果你想降低像Dudedolf这样的开发成本。 –

+0

您可能会认为您开始时会降低开发成本,但考虑未来。如果您想为字幕系列添加额外的字段,该怎么办?例如,可能有一个用于生成身份证号码的前缀(学生身份证号码以11开头,22岁的教师和33岁的职员)。您需要添加某种只适用于“Category”Capt_Family类型的Prefix列,并且所有其他列都不会使用。另外,你如何对你的代码有一个外键约束? – Jerrad