2011-08-19 28 views
1

我認爲我有一個相當直接的設計問題。多個應用程序的集中式數據庫

說我有3個應用

App1 
App2 
App3 

他們都需要訪問常用數據,所以我做了一個餐桌上常見的數據庫名爲Locations

所有三個應用程序可以更新表中的信息,但我想爲每個應用程序提供一個IsEnabled,這樣每個應用程序就可以具有啓用/禁用表中每個Location行的功能。

我不認爲我想在表格中爲每個應用程序創建一個bit列,以查看它的啓用與否,但我不知道?謝謝!

回答

3

你可以有一個單獨的表如下:

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

現在反而增加了位置表中的每個應用程序一欄,你只需要添加一行到這個映射表。您還可以擴展此功能以支持可能特定於應用程序的其他屬性:位置組合。

+0

謝謝!現在要弄清楚爲什麼EF不會讓我通過導航屬性執行where子句。 – MisterIsaak

1

如果是我,我會在數據庫和這些應用程序之間創建一個抽象層。這將消除每次數據庫更改時都必須重構所有應用程序的情況,併爲您提供了多種用於控制對數據訪問的選項。

0

你可以這樣做很容易:

  • 創建三個獨立的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進行更新。

+1

問題在於模式維護。假設我們添加App4和App5,現在我們需要更改表結構和計算列。 –

+0

@Aaron Bertrand:當然,只要你有三個,四個應用程序,它就可以正常工作,而且這個數字不可能迅速增加。另一方面:只要您的應用數量較少,您必須經歷的麻煩遠遠少於您的解決方案。 –

+1

我認爲我們可能對「麻煩」有不同的定義 - 我喜歡用關係表達這些東西,而不是作爲屬性 - 在名稱中包含一個包含數據的列並不適合我。你的另一個問題是,如果你想爲每個應用程序添加另一個屬性......還有三列,等等。 –

相關問題