Sql server 用于多个应用程序的集中式数据库

Sql server 用于多个应用程序的集中式数据库,sql-server,database,database-design,Sql Server,Database,Database Design,我想我有一个相当直接的设计问题 假设我有3份申请 App1 App2 App3 它们都需要访问公共数据,所以我用一个名为Locations 所有三个应用程序都可以更新表中的信息,但我希望每个应用程序都有一个IsEnabled,这样每个应用程序都可以启用/禁用表中的每个位置行 我不想在表中为每个应用程序设置一个bit列,以查看其是否已启用,但我不知道?谢谢 如果是我,我会在数据库和这些应用程序之间创建一个抽象层。这将消除每次数据库更改时必须重构所有应用程序的情况,并为您提供多种控制数据访问的选项

我想我有一个相当直接的设计问题

假设我有3份申请

App1
App2
App3
它们都需要访问公共数据,所以我用一个名为
Locations

所有三个应用程序都可以更新表中的信息,但我希望每个应用程序都有一个
IsEnabled
,这样每个应用程序都可以启用/禁用表中的每个
位置


我不想在表中为每个应用程序设置一个
bit
列,以查看其是否已启用,但我不知道?谢谢

如果是我,我会在数据库和这些应用程序之间创建一个抽象层。这将消除每次数据库更改时必须重构所有应用程序的情况,并为您提供多种控制数据访问的选项。

如果是我,我将在数据库和这些应用程序之间创建一个抽象层。这将消除每次数据库更改时必须重构所有应用程序的情况,并为您提供多种控制数据访问的选项。

您可以非常轻松地做到这一点:

  • 创建三个独立的
    AppXEnabled BIT
    列-让每个应用设置自己的“启用”标志
  • 创建一个“组合”计算列,确保至少设置了三个标志中的一个
大概是这样的:

CREATE TABLE dbo.YourTable
   (ID INT IDENTITY PRIMARY KEY, 
    ...(your columns here) .....,
    App1Enabled BIT, 
    App2Enabled BIT, 
    App3Enabled BIT)

ALTER TABLE dbo.YourTable
ADD AtLeastOneEnabled AS App1Enabled | App2Enabled | App3Enabled PERSISTED
现在,您的行将具有三个独立的
AppXEnabled
标志,以及一个组合标志
AtLeastOneEnabled
,当至少设置了一个标志时,该标志将显示
true(1)
,当三个应用标志均未设置时,该标志将显示为
false(0)


这是一个计算列,意味着它将始终是最新的,并根据需要由SQL Server进行更新。

您可以非常轻松地执行此操作:

  • 创建三个独立的
    AppXEnabled BIT
    列-让每个应用设置自己的“启用”标志
  • 创建一个“组合”计算列,确保至少设置了三个标志中的一个
大概是这样的:

CREATE TABLE dbo.YourTable
   (ID INT IDENTITY PRIMARY KEY, 
    ...(your columns here) .....,
    App1Enabled BIT, 
    App2Enabled BIT, 
    App3Enabled BIT)

ALTER TABLE dbo.YourTable
ADD AtLeastOneEnabled AS App1Enabled | App2Enabled | App3Enabled PERSISTED
现在,您的行将具有三个独立的
AppXEnabled
标志,以及一个组合标志
AtLeastOneEnabled
,当至少设置了一个标志时,该标志将显示
true(1)
,当三个应用标志均未设置时,该标志将显示为
false(0)


这是一个计算列,意味着它将始终是最新的,并根据需要由SQL Server进行更新。

您可以有一个单独的表,如下所示:

CREATE TABLE ApplicationLocations
(
    ApplicationID INT,
    LocationID INT,
    IsEnabled BIT
);

现在,不必为每个应用程序向locations表中添加列,只需向该映射表中添加一行即可。您还可以扩展它以支持特定于应用程序的其他属性:位置组合。

您可以有一个单独的表,如下所示:

CREATE TABLE ApplicationLocations
(
    ApplicationID INT,
    LocationID INT,
    IsEnabled BIT
);

现在,不必为每个应用程序向locations表中添加列,只需向该映射表中添加一行即可。您还可以扩展它以支持可能特定于应用程序的其他属性:位置组合。

问题在于架构维护。假设我们添加了App4和App5,现在我们需要更改表结构和计算列。@Aaron Bertrand:是的,当然-只要有三、四个应用程序,它就可以正常工作-这个数字不太可能快速显著增加。另一方面:只要你有少量的应用程序,你所经历的麻烦就比你的解决方案要少得多。我想我们可能对“麻烦”有不同的定义——我喜欢用关系而不是属性来表达这些东西——在名称中包含数据的列对我来说不合适。你的另一个问题是,如果你想为每个应用添加另一个属性。。。还有三个专栏等@Aaron Bertrand:同意-如果每个应用程序需要的不仅仅是这个“已启用”标志,那么毫无疑问-你的方法就是要走的路。问题是模式维护。假设我们添加了App4和App5,现在我们需要更改表结构和计算列。@Aaron Bertrand:是的,当然-只要有三、四个应用程序,它就可以正常工作-这个数字不太可能快速显著增加。另一方面:只要你有少量的应用程序,你所经历的麻烦就比你的解决方案要少得多。我想我们可能对“麻烦”有不同的定义——我喜欢用关系而不是属性来表达这些东西——在名称中包含数据的列对我来说不合适。你的另一个问题是,如果你想为每个应用添加另一个属性。。。还有三个专栏等等。@Aaron Bertrand:同意-如果你需要的不仅仅是每个应用程序的“启用”标志,那么毫无疑问-你的方法是正确的。谢谢!现在来看看为什么EF不允许我通过导航属性执行where子句。谢谢!现在,我想知道为什么EF不允许我通过navigation属性执行where子句。