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