0

我不确定处理这个问题的最佳方法是什么,所以我正在寻找一些输入。我有 3 张桌子,让我们打电话给他们

User
WidgetA
WidgetB

由于我不想进入两个小部件表的原因,不能混合使用,它们来自 2 个不同的来源。WidgetA 使用 GUID 作为键,而 WidgetB 使用自动增量。用户将被允许从 A 或 B 中选择他们最喜欢的小部件。设置它的最佳方法是什么?我应该有两个收藏夹表,将小部件连接到用户,这样我就可以做一些简单的连接,还是有更好的方法?

4

3 回答 3

1

假设您不能对现有的 Widget 表进行任何更改,您可以这样做:

UserWidget
==========
UserWidgetID <-- PK, autoincrement
UserID <-- int
GuidKey <-- NULLable GUID
IntKey <-- NULLable int
Type <-- varchar ('WidgetA' or 'WidgetB')

您的查询将如下所示:

select uw.UserID, a.*, b.*
from UserWidget uw
left outer join WidgetA a on uw.Type = 'WidgetA' and uw.GuidKey = a.WidgetAID
left outer join WidgetB b on uw.Type = 'WidgetB' and uw.IntKey = b.WidgetBID
于 2012-07-17T13:14:00.717 回答
0

这很简单,您需要在关系 DBMS 中进行继承。您将创建一个具有自动递增键的通用 Widget 表,并将其主键作为外键存储在两个 WidgetA 和 WidgetB 表中。现在您可以将这两种 Widget 视为一种,因为它们都有 Widget 的 id。

够清楚吗?

编辑

以下是我在 ERD 中的话:

在此处输入图像描述

于 2012-07-17T13:18:43.957 回答
0

您可以将两个 ID 都存储为字符串(varchar):

UserID
WidgetID

询问:

Select *
From Favorite f
    Inner Join WidgetA a on f.WidgetID = Cast(a.WidgetID as varchar(max))
    Inner Join WidgetB b on f.WidgetID = Cast(b.WidgetID as varchar(max))
Where f.UserID = @userid
于 2012-07-17T13:20:42.493 回答