Sql-Server-2012

SQL Server 如何使用具有多個值的欄位?

  • January 10, 2020

例如,我在 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。當然,每個環境都是不同的,所以這對你來說可能不是問題。我只是覺得值得一提。

引用自:https://dba.stackexchange.com/questions/257019