最佳做法的代码或查找表
-
09-09-2019 - |
题
[更新]选择办法下,对这个问题的回应
嗨,
I've been looking围绕在这一主题但是我真的不能找到我在寻找什么...
用代码表我的意思是:这样的东西'maritial状态',性别,具体的法律或社会的国家...更具体地说,这些类型只有设置性能和项目不是关于很快改变(但可以).性是一个Id,一个名称和说明。
我想知道如何处理这些最好在以下技术:
在数据库(多个表格,一个表与不同的代码钥匙...?)
创建的类别(可能喜欢的东西继承ICode与ICode.姓名和ICode.说明)
创建图/主持人:应该有一个屏幕上包含所有的人,所以列表的种类(性别、maritial状态...),并随后的列表的价值观对于这种类型的名称和说明每个项目价值的列表。
这些都是出现在每一个项目,因此必须有一些最佳做法上如何处理这些...
为了记录在案,我真的不喜欢使用枚举,对这些情况下...任何论据上使用他们在这里欢迎。
[遵循]
Ok,我已经得到了一个很好的答案通过CodeToGlory和Ahsteele.让我们改进这个问题。
说我们不是在谈论性别或maritial地位,这值肯定没有改变,但是关于"东西"这一名称和说明,但没有更多。例如:社会现状态的、法律的状态。
用户界面:我想只有一个屏幕。列表框用感possibe NameAndDescription类型(我就打电话给他们,),列表框用可能值的选择NameAndDescription类型,然后名称和说明的领域为选定的NameAndDescription类型的项目。
这怎么可能处理在查看和主持人?我找到这里的困难,NameAndDescription类会然后需要提取该类的名字吗?
DB:什么是pro/弊多vs个查找表?
解决方案 3
我已经决定用这种方法:
CodeKeyManager mgr = new CodeKeyManager();
CodeKey maritalStatuses = mgr.ReadByCodeName(Code.MaritalStatus);
其中:
- CodeKeyManager可以检索CodeKeys从数据库(CodeKey=MaritalStatus)
- 代码是一类充满了常数,返回串这样的代码。MaritalStatus="maritalStatus".这些常量地图的CodeKey表>CodeKeyName
- 在数据库中,我有2表:
- CodeKey与Id,CodeKeyName
- CodeValue与CodeKeyId,ValueName,值说明
DB:
alt文本http://lh3.ggpht.com/_cNmigBr3EkA/SeZnmHcgHZI/AAAAAAAAAFU/2OTzmtMNqFw/codetables_1.JPG
类代码:
public class Code
{
public const string Gender = "gender";
public const string MaritalStatus = "maritalStatus";
}
类CodeKey:
public class CodeKey
{
public Guid Id { get; set; }
public string CodeName { get; set; }
public IList<CodeValue> CodeValues { get; set; }
}
类CodeValue:
public class CodeValue
{
public Guid Id { get; set; }
public CodeKey Code { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
我找到迄今为止最简单和最有效的方式:
- 所有代的数据可以显示在一个相同的方式(在同样的观点/主持人)
- 我不需要创建表和课程的每一个代码表的到来
- 但我仍然可以让他们的数据库容易,并利用它们容易与CodeKey常...
- 它能够可以处理这个问题太容易
我唯一仍在考虑是扔出GUID身份证和使用的字符串(仅必)的代码可用性在业务逻辑。
谢谢你的答案!如果有任何评论对这种方法,请不要!
其他提示
使用数据库驱动的代表可能非常有用的。你可以做的事情一样定义的生活的数据(采用开始和结束日期),增加数据表在真正的时间,所以你不需要部署代码,可以允许用户(有权特权的课程)添加数据,通过管理屏幕。
我会建议总是采用自动编号主要钥匙的而不是代码或说明。这可以让你使用多代码(相同的名称,但不同的描述)在不同的时期。再加上大多数数据库管理员(在我的经验),而是使用自动编号在基于文本的主键。
我会用一个单一的表每个编码的清单。你可以把多代码成一个表,不涉及(使用一个矩阵的各种各样),但是这变得混乱和我只有找到一对夫妇情况下甚至是有益的。
几件事情在这里:
使用枚举,都是明确清楚的,并不会改变。例如,MaritalStatus、性别等。
使用对照表,对项目不是固定作为上述和可能的改变,增加/减少的时间。
这是非常典型的有查表中的数据库。定义key/value目在业务层,可以与你的查看/演示文稿。
我倾向于使用一个表格表示这种类型的数据。最后,如果你有需要捕捉到的数据只有一个需要存储。为报告目的,最好是有一个地方你可以借鉴的数据通过一个关键。正常化的目的,我找到单一目的的查询表可以更容易,比多目的查找表。
这说枚举工作非常好的事情不会改变的像性别等。
为什么每个人都想要的复杂的代表?是的有很多他们,但他们是简单的,因此,保持他们的方式。只是把他们像以往其他目的。你们域的一部分,因此他们作为模型域的一部分,没有什么特别的。如果你不在他们inevitibly需要更多的属性或功能,你将要撤消所有代码,目前使用它,并返工。
一个表格,每当然(为参照完整性和使它们可用于报告)。
为课程,又一个每当然的,因为如果我写的一个方法,收到"性别"一目的,我不希望能够不小心把它传递一个"MarritalStatus"!让我们编译帮助你淘汰运行错误,这就是为什么它在那里。每一类可以简单地继承或者包含一CodeTable类或什么,但这只是一个执行助手。
UI,如果它不会在实际上使用的继承CodeTable,我想你可以用它来帮助你,只是维护它在一个界面。
作为一项规则,不要搞乱了数据库模式,不要搞乱了的业务模式,但它你来的螺钉了一下周围的UI模型,这不是那么糟糕。
我想考虑简化这种做法甚至更多。而不是表3定义的代码(代码,CodeKey和CodeValue)关于如何只是一个表,其中包含两个代码类型和代码的价值观?在所有的代码类型只是一个列表中的编码。
也许表的定义是这样的:
CREATE TABLE [dbo].[Code](
[CodeType] [int] NOT NULL,
[Code] [int] NOT NULL,
[CodeDescription] [nvarchar](40) NOT NULL,
[CodeAbreviation] [nvarchar](10) NULL,
[DateEffective] [datetime] NULL,
[DateExpired] [datetime] NULL,
CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED
(
[CodeType] ASC,
[Code] ASC
)
GO
有可能是一个根本记录与CodeType=0,Code=0其代表的类型CodeType.所有的CodeType记录,将有一个CodeType=0和一个码>=1个。这里是一些样品数据,这可能有助于澄清一件事:
SELECT CodeType, Code, Description FROM Code
Results:
CodeType Code Description
-------- ---- -----------
0 0 Type
0 1 Gender
0 2 Hair Color
1 1 Male
1 2 Female
2 1 Blonde
2 2 Brunette
2 3 Redhead
一个检查制约可能加入的代码表,以确保一个有效的CodeType输入表:
ALTER TABLE [dbo].[Code] WITH CHECK ADD CONSTRAINT [CK_Code_CodeType]
CHECK (([dbo].[IsValidCodeType]([CodeType])=(1)))
GO
功能IsValidCodeType可能定义这样的:
CREATE FUNCTION [dbo].[IsValidCodeType]
(
@Code INT
)
RETURNS BIT
AS
BEGIN
DECLARE @Result BIT
IF EXISTS(SELECT * FROM dbo.Code WHERE CodeType = 0 AND Code = @Code)
SET @Result = 1
ELSE
SET @Result = 0
RETURN @Result
END
GO
一个问题,已提出是如何确保一个表格有一个代码列有一个适当的价值,代码类型。这也可以强制执行通过检查约束使用一个功能。
这里是一个人表其具有性别列。这可能是一个最佳做法名称的所有代码列于说明的代码类型(两性在这个例子),其次是字代码:
CREATE TABLE [dbo].[Person](
[PersonID] [int] IDENTITY(1,1) NOT NULL,
[LastName] [nvarchar](40) NULL,
[FirstName] [nvarchar](40) NULL,
[GenderCode] [int] NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonID] ASC)
GO
ALTER TABLE [dbo].[Person] WITH CHECK ADD CONSTRAINT [CK_Person_GenderCode]
CHECK (([dbo].[IsValidCode]('Gender',[Gendercode])=(1)))
GO
IsValidCode可能定义这种方式:
CREATE FUNCTION [dbo].[IsValidCode]
(
@CodeTypeDescription NVARCHAR(40),
@Code INT
)
RETURNS BIT
AS
BEGIN
DECLARE @CodeType INT
DECLARE @Result BIT
SELECT @CodeType = Code
FROM dbo.Code
WHERE CodeType = 0 AND CodeDescription = @CodeTypeDescription
IF (@CodeType IS NULL)
BEGIN
SET @Result = 0
END
ELSE
BEGiN
IF EXISTS(SELECT * FROM dbo.Code WHERE CodeType = @CodeType AND Code = @Code)
SET @Result = 1
ELSE
SET @Result = 0
END
RETURN @Result
END
GO
另一个功能可以创造提供代码的说明查询表,有一个代码列。这里是一个 例的查询人表:
SELECT PersonID,
LastName,
FirstName,
GetCodeDescription('Gender',GenderCode) AS Gender
FROM Person
这是所有设想的角度对防止扩散查表中的数据库,并提供一个查找表。我不知道是否这种设计将执行以及在实践。