我正在试图找出重构我的数据库的最佳方法,因为我没有提前计划,现在我有点卡在这一部分:)
我有一个名为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
答案 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