2013-11-25 130 views
0

我試圖找出調整自己的數據庫,因爲我沒有未雨綢繆的最佳方式,現在我在這部分有點卡住:)建立數據庫結構

我有一個表叫廣告活動和一個稱爲數據類型的表。

每個廣告系列是一個唯一的記錄,可保存大約10個數據字段。

的數據類型包含3個字段 - ID,型號,說明

當你創建一個活動,你可以選擇儘可能多的數據類型,你想。

1,2或全部3個。

我的問題是 - 我如何存儲用戶在活動記錄中選擇的內容?

我需要能夠提取廣告系列的詳細信息,但也知道選擇了哪些數據類型。

我最初是如何設置的數據類型是在1個字段中,逗號分隔但學到的並不理想。

完成此操作的最佳方法是什麼?將數據存儲爲XML?

更新 -

這裏是我試圖去上班(它可能是遙遠)查詢的例子。

 BEGIN 
      SET NOCOUNT ON; 
        BEGIN 
         SELECT * 
       FROM (SELECT A.[campaignID] as campaignID, 
           A.[campaignTitle], 
           A.[campaignDesc], 
           A.[campaignType], 
           A.[campaignStatus], 
           A.[duration], 
           A.[whoCreated], 
           B.[campaignID], 
           B.[dataType], 
           (SELECT * 
            FROM Tags_Campaign_Settings 
            WHERE campaignID = @campaignID) AS dataTypes 
         FROM  Tags_Campaigns AS A 
           INNER JOIN 
           Tags_Campaign_Settings AS B 
           ON A.[campaignID] = B.[campaignID] 
         WHERE A.[campaignID] = @campaignID 
         ) AS a 
       FOR XML PATH ('campaigns'), TYPE, ELEMENTS, ROOT ('root'); 
        END 
     END 

回答

0

使用campaignId和dataTypeId創建一個名爲Campain_DataType的連接表。確保他們是外鍵約束到各自的表。當您查詢廣告系列數據時,您可以創建單獨的查詢以獲取基於campaignId的數據類型信息,也可以執行左外部聯合以將廣告系列及其數據類型一起提取。

如果您想將3種數據類型合併到同一行中,請進行以下操作。這絕對是在黑客的一面,它只能使用固定數量的數據類型。如果您添加其他數據類型,則必須更新此查詢才能支持該數據類型。

SELECT 
    Campaign.ID, 
    Campaign.foo, 
    Campaign.bar, 
    dataType1.hasDataType1, 
    dataType2.hasDataType2, 
    dataType3.hasDataType3 
FROM 
    Campaign 
    LEFT OUTER JOIN 
    (SELECT 
     1 as hasDataType1, 
     Campaign_DataType.campaignID 
    FROM 
     DataType 
     INNER JOIN Campaign_DataType ON Campaign_DataType.dataTypeId = DataType.id 
    WHERE 
     DataType.Type = 'Type1' 
) dataType1 ON dataType1.campaignID = Campaign.ID 
    LEFT OUTER JOIN 
    (SELECT 
     1 as hasDataType2, 
     Campaign_DataType.campaignID 
    FROM 
     DataType 
     INNER JOIN Campaign_DataType ON Campaign_DataType.dataTypeId = DataType.id 
    WHERE 
     DataType.Type = 'Type2' 
) dataType2 ON dataType2.campaignID = Campaign.ID 
    LEFT OUTER JOIN 
    (SELECT 
     1 as hasDataType3, 
     Campaign_DataType.campaignID 
    FROM 
     DataType 
     INNER JOIN Campaign_DataType ON Campaign_DataType.dataTypeId = DataType.id 
    WHERE 
     DataType.Type = 'Type3' 
) dataType3 ON dataType3.campaignID = Campaign.ID 

您收到的每個Campaign的記錄將有三個字段:hasDataType1,hasDataType2,hasDataType3。這些列是1表示否,NULL表示否。

+0

在我的研究過程中,我認爲它最終會變成這樣的東西,但是當我嘗試它並在campaignID上加入時,它給了我一個重複的數據集,唯一的區別是數據類型ID。我不確定如何儘可能獲得一條記錄,並附有與之相關的所有ID – SBB

+0

好的,我爲你準備了一些東西 - 待機。 –

+0

好的,我發佈了一個基於你所說的內容,但我認爲它的方式 – SBB