【问题标题】:Centralized database for multiple applications用于多个应用程序的集中式数据库
【发布时间】:2023-03-26 23:54:01
【问题描述】:

我想我有一个相当直截了当的设计问题。

假设我有 3 个应用程序

App1
App2
App3

他们都需要访问公共数据,所以我做了一个公共数据库,有一个名为Locations的表

所有三个应用程序都可以更新表中的信息,但我希望每个应用程序都有一个IsEnabled,这样每个应用程序都可以具有启用/禁用表中每个Location 行的功能。

我不认为我想在表格中为每个应用创建一个bit 列以查看其是否启用但我不知道?谢谢!

【问题讨论】:

    标签: sql-server database database-design


    【解决方案1】:

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

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

    现在,您无需在每个应用程序的位置表中添加一列,而是在此映射表中添加一行。您还可以扩展它以支持可能特定于 application:location 组合的其他属性。

    【讨论】:

    • 谢谢!现在弄清楚为什么 EF 不允许我通过导航属性执行 where 子句。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以很容易地做到这一点:

      • 创建三个单独的 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 根据需要进行更新。

      【讨论】:

      • 这个问题是模式维护。假设我们添加 App4 和 App5,现在我们需要更改表结构和计算列。
      • @Aaron Bertrand:是的,当然——只要你有三四个应用程序,它就可以正常工作——而且这个数字不太可能快速而显着地增加。另一方面:只要您的应用程序数量很少,您必须经历的麻烦要比您的解决方案少得多。
      • 我认为我们可能对“麻烦”有不同的定义——我喜欢用关系而不是属性来表达这些事情——在名称中包含数据的列对我来说并不合适。你的另一个问题是,如果你想为每个应用添加另一个属性......还有三列,等等。
      • @Aaron Bertrand:同意 - 如果您需要的不仅仅是每个应用程序的单个“启用”标志,那么毫无疑问 - 您的方法就是要走的路。
      猜你喜欢
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 2015-12-14
      • 2020-07-11
      • 2011-05-19
      • 1970-01-01
      相关资源
      最近更新 更多