设置数据库结构

时间:2013-11-25 03:01:31

标签: sql sql-server tsql

我正在试图找出重构我的数据库的最佳方法,因为我没有提前计划,现在我有点卡在这一部分:)

我有一个名为Campaigns的表和一个名为Data Types的表。

每个广告系列都是一个包含大约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

2 个答案:

答案 0 :(得分:0)

使用campaignId和dataTypeId创建名为Campain_DataType的连接表。确保它们的外键受限于相应的表。查询广告系列数据时,您可以创建单独的查询以根据campaignId获取数据类型信息,也可以执行左外连接以一起获取广告系列及其数据类型。

如果要将3种数据类型折叠到同一行,请提供以下内容。它肯定是在hacky方面,它只适用于固定数量的数据类型。如果您添加其他数据类型,则必须更新此查询以支持它。

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

您为每个广告系列收到的记录将包含三个字段:hasDataType1,hasDataType2,hasDataType3。这些列将为1表示是,NULL表示否。

答案 1 :(得分:0)

在我看来,你想要的是一个交叉表查询。看一眼: Sql Server 2008 Cross Tab Query