如何用sqlserver设计多国数据库表

如何用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

我首先使用ASP.NET核心MVC和实体框架核心代码(对于SQL Server数据库)来开发应用程序,作为学习练习。从偏移量来看,我希望数据库和应用程序设计能够处理多国场景

为了简单起见,我们假设我有一个
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。我相信,编写准确了解模型的代码比尝试编写动态代码更容易,因为动态代码试图为未来做全面的准备