2013-11-25 129 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