Sql-Server-2012
SQL Server 如何使用具有多個值的欄位?
例如,我在 MongoDB 中有一個欄位,如下所示:
"SignedDocs" : [ { "_id" : "blablabla" "title": " bla bla bla" }, { "_id" : "blablabla2" "title": " bla bla bla2" }, { "_id" : "blablabla3" "title": " bla bla bla3" } ]
為了您理解,在此欄位內有 3 個值。使用 SQL Server 實現這一目標的最佳方法是什麼?在列中保存 3 個值的最佳做法是什麼?
我不想做這樣的事情:
NAME | DOCSSIGNED abduh | 1 abduh | 2 abduh | 3
擁有許多具有相同值的行只會將此
DOCSSIGNED
欄位更改為指向 DOCS 表的 FK。編輯:哦,也許這兩個連結它們之間的第三個表?
在較新版本的 SQL Server 上,您可能會考慮按原樣引入 JSON 數據,將其儲存在
nvarchar(max)
列中,並使用內置的 JSON 相關函式來解析和查詢 JSON 數據。這在 SQL Server 2016+(兼容級別 130)中可用。您可以在此處閱讀有關它的更多資訊:SQL Server 中的 JSON 數據如果您打算將 MongoDB 文件“轉換”為更具關係的模式,那麼您提到的映射表將是防止簽名者的“名稱”在每一行中重複的好方法。
看起來您在 MongoDB 文件中建模的是已由給定人員簽名的文件集合。所以關係結構是這樣的:
文件表格:
CREATE TABLE dbo.Docs ( ID int IDENTITY PRIMARY KEY NOT NULL, [Title] varchar(100) NOT NULL );
簽署這些文件的人的表格:
CREATE TABLE dbo.Person ( Id int IDENTITY PRIMARY KEY NOT NULL, [Name] varchar(100) NOT NULL );
然後是一張匯總了一個人簽署的所有文件的表格:
CREATE TABLE dbo.SignedDocs ( PersonId int NOT NULL, DocId int NOT NULL, CONSTRAINT FK_SignedDocs_Person FOREIGN KEY (PersonId) REFERENCES dbo.Person (Id), CONSTRAINT FK_SignedDocs_Docs FOREIGN KEY (DocId) REFERENCES dbo.Docs (Id) );
如果需要強制執行其他規則(例如,文件只能由一個人簽名),您可以向表中添加更多約束。
請注意,執行這種將 NoSQL 數據轉換為關係數據的“ETL”過程可能會產生大量維護成本。像 MongoDB 這樣的文件數據庫的優點之一是可以輕鬆更改文件的結構。這很有可能打破 ETL。當然,每個環境都是不同的,所以這對你來說可能不是問題。我只是覺得值得一提。