C# 在SQL Server和C中表示查找表#

C# 在SQL Server和C中表示查找表#,c#,sql-server,tsql,sql-server-2012,C#,Sql Server,Tsql,Sql Server 2012,我们正在通过其API向外部服务发送关于化身状态的更新 阿凡达: ID Name Age Nationality Status 我们可以发送4种状态: (A) Alive (D) Dead (C) Injured (U) Unknown 括号中的字符是状态在外部系统中的存储方式,我们必须以该格式发送它们ID和状态 我们需要将这些存储在SQL Server中,这样我们就可以在avatar表中获得状态表的主键 我们还需要用C代码表示状态。状态不太可能改变——因此枚举或字典(我认为)是一种表示状

我们正在通过其API向外部服务发送关于化身状态的更新

阿凡达:

ID  
Name
Age
Nationality
Status
我们可以发送4种状态:

(A) Alive
(D) Dead
(C) Injured
(U) Unknown
括号中的字符是状态在外部系统中的存储方式,我们必须以该格式发送它们ID和状态

我们需要将这些存储在SQL Server中,这样我们就可以在avatar表中获得状态表的主键

我们还需要用C代码表示状态。状态不太可能改变——因此枚举或字典(我认为)是一种表示状态的合适方式,可以在C代码中清晰地显示它们

我们可以向状态表中添加一个int主键,然后使用一个字母表示(发送到外部系统)和全名

或者我们可以将主键设置为char(1)作为字母,并将其存储在Avatar表的Status列中

前者可以是枚举,后者可以是C#中的字典

这两种方法都存在正常化问题。从面向对象的角度来看,这两种方法都存在问题


在这两种情况下,最佳做法是什么?

您的问题主要基于观点;至于什么是最好的,没有普遍的答案

我的建议是基于关注点分离的原则。我在数据库层和应用程序层中尽可能地压缩“数据”。“表示层”是我处理人类可读格式的地方。这与使用日期时间值类似;Sql Server将其存储为一个8字节的数字,而.Net将其存储为一个数字。只有当我们想看到它时,我们才应该使用
to…String()
系列进入演示格式

现在来看你的特定场景

ID我通常建议使用基于整数的格式,我很可能使用SQL Server的
IDENTITY()
来填充该格式

名字这里没有真正的争论;Net中的字符串和Sql Server中的nvarchar。我可能会把这个限制在100个字符以内

年龄这里关于年龄的问题是角色是否会变老。如果角色将实时老化,则这将不是一个整数,而是基于日期时间的DOB值,应用层将基于此计算老化

国籍最有可能在应用程序层和数据库层中作为数值使用。演示文稿可以使用字典或类似的查找进行显示

状态按照您的建议,将其保留为一个数字,直到显示为止;枚举、字典等可用于查找


我还尝试让db模式与类属性匹配,在顶部是最小的类型(bool,int),在末尾是较长的字符串。

谢谢-我的问题是-将statuses表的主键存储为int或char(1)?如果是int,则需要一些额外的外观来将其更改为发送到外部系统所需的字符(1)-尽管int PK通常更好@niico-我的建议是TinyInt,在SQL中的存储大小与CHAR(1)相同,但在PK和索引(clusterd与否)上要容易得多。所以性能比可读性更重要?该性能仅在执行化身和状态表之间的连接时相关吗?数据存储和应用程序逻辑应使用最小的可能数据类型。表示层是可读性成为工厂的地方。有了如此有限的价值观,你很可能无论如何都会记住它们