如何用sqlserver设计多国数据库表
我首先使用ASP.NET核心MVC和实体框架核心代码(对于SQL Server数据库)来开发应用程序,作为学习练习。从偏移量来看,我希望数据库和应用程序设计能够处理多国场景 为了简单起见,我们假设我有一个如何用sqlserver设计多国数据库表,sql,sql-server,asp.net-mvc,entity-framework,Sql,Sql Server,Asp.net Mvc,Entity Framework,我首先使用ASP.NET核心MVC和实体框架核心代码(对于SQL Server数据库)来开发应用程序,作为学习练习。从偏移量来看,我希望数据库和应用程序设计能够处理多国场景 为了简单起见,我们假设我有一个Employee表和一个EmployeeDetails表。您将如何着手设计数据库,使员工详细信息因国家而异 例如,在英国,我们有一个国家保险号码,因为此数据列不适用于其他国家的员工 您是否有一个包含所有可能数据列的表,但在适当的情况下在UI中禁用它们?但是,这将阻止您将列标记为必需的(不可为nu
Employee
表和一个EmployeeDetails
表。您将如何着手设计数据库,使员工详细信息因国家而异
例如,在英国,我们有一个国家保险号码,因为此数据列不适用于其他国家的员工
您是否有一个包含所有可能数据列的表,但在适当的情况下在UI中禁用它们?但是,这将阻止您将列标记为必需的(不可为null)
您是否有多个EmployeeDetails
表格,每个国家一个?这意味着数据检索代码必须进行分支。此外,您需要维护多个表,并且可能会导致列复制
您是否有一个通用的EmployeeDetails
表,并有一个与其分支的相关表,其中包含特定于某个国家的数据字段?i、 e.(EmployeeDetails>ED_UK
)和(EmployeeDetails>ED_France
)和(EmployeeDetails>ED_US
)
拥有动态数据列还意味着必须构建一个只能够呈现适用列的动态HTML UI。我无法想象一个人会想要构建多个UI,每个国家一个,以基本上实现相同的任务
我非常欢迎所有反馈和建议。视情况而定
在这个特定的示例中,大多数国家都有某种识别号,用于向税务员标识员工。英国可能会称之为国家保险号码,美国可能会称之为社会保险号码,其他国家也会有其他名称,但在概念上,各国都是一样的。在这种情况下,我将有一个单独的列来存储税务识别号,但将标签在UI中本地化,以便美国版本显示“社会保险号”,英国版本显示“国家保险号”,等等
如果你要建立一个全面的工资系统,需要有一系列针对具体国家的税收和旧的属性,那么你可能要看单独的表格。每个国家都将有一个合理独特的设置,有非常具体的法律法规,需要进行编码,因此有一套表格用于美国国税局需要的信息,一套单独的表格用于英国HMRC需要的信息,个人雇员将被设置在一个或多个税收制度中(大多数可能只在一个税收制度中),与这些表交互的代码可能非常专业。您可能会从头开始为特定国家的税务机关编写模块,并在主应用程序中使用某种插件框架,而不是尝试编写一个通用UI,该UI将动态地知道如何重新配置自身,以请求IRS想要的信息与HMRC想要的信息以及执行针对税务机关的特定规则。这是一个相当广泛的问题,因为我不相信有一个明确的答案。然而,当你用这种方式描述这样的事情时
为了简单起见,假设我有一个Employee表&一个EmployeeDetails表。您将如何着手设计数据库,使员工的详细信息因国家而异
这听起来像是继承可能有助于解决这个问题。因此,暂时忽略数据存储,您可能会有如下域实体:
// abstract maybe...
public class EmployeeBase
{
public string FirstName { get; set; }
// etc...
}
// UKEmployee or EmployeeUK whatever..
public class UKEmployee : EmployeeBase
{
// Uk Specific Properties
}
在查看SQL之前,我总是希望查看表示级别是否存在架构问题。既然你提到了MVC(我会使用automapper映射到视图模型),现在我只会将它们映射到类似的模型
public class EmployeeBaseVM { ... }
public class UKEmployeeVM : EmployeeBaseVM { ... }
我想最简单的方法是
// Encapsulating class for and index method on a controller
public class IndexVM
{
public UKEmployeeVM { get; set; }
}
我将制作两个显示模板(到目前为止):
UKEmployeeVM.cshtml
@model UKEmployeeVM
@* display shared properties *@
@Html.DisplayFor(m => m, "EmployeeBaseVM")
@* display specific properties *@
@Html.DisplayFor(m => m.SomeProperty)
@model EmployeeBaseVM
@* I hope you get where this is going *@
EmployeeBaseVM.cshtml
@model UKEmployeeVM
@* display shared properties *@
@Html.DisplayFor(m => m, "EmployeeBaseVM")
@* display specific properties *@
@Html.DisplayFor(m => m.SomeProperty)
@model EmployeeBaseVM
@* I hope you get where this is going *@
因此,表示层似乎相当简单,让我们来处理数据存储。既然你用的是EF,我建议你用。无需详细说明,该页面很好地解释了这一点
但是,它没有详细介绍SQL结构。看起来你有伪无限的国家,而不是
[dbo].[EmployeeBase]
[dbo].[UKEmployee]
这似乎会变得笨拙,我建议您切换到模式进行分段
[base].[Employee]
[UK].[Employee]
这样做的缺点是,任何新的国家/地区或功能都需要新的模式、EF、域和Viewmodels。我相信,编写准确了解模型的代码比尝试编写动态代码更容易,因为动态代码试图为未来做全面的准备