4

我有两个下拉列表,一个用于项目,第二个用于类别。
我有一个选择 ddproject 我得到 id 的地方,基于这个 id 我必须填充 ddcategory。
表结构SQL FIDDLE

如果我从下拉列表中选择 ProjectOne,这里是简单的查询

select  id,name from tbcategory where id in(1,2)  

但我的问题是我不知道在这种情况下会有多少价值in

C#:第一次我拆分列名categoryid并稍后获取值,这让我感到困惑。
也让我知道是否以正确的方式或任何其他替代方式来实现这一目标

编辑: 或者我应该改变我的表结构,如果是,那么应该是什么模式?

4

3 回答 3

3

根据您的数据,Category 和 Project 之间存在多:多关系。因此,您需要对另一个 Many:Many 表进行建模,以保存对这种关系进行建模的数据。

SQL小提琴在这里

首先,创建一个新表来保存 Category 和 Project 之间的 Many:Many 关系:

create table tbProjectCategory
(
  tbProjectId INT,
  tbCategoryId INT
);

然后,删除 tbProject 中的字符串逗号分隔关系 - 这没有用。相反,将链接插入到 Many Many 表中。例如:

insert into tbProjectCategory(tbProjectId, tbCategoryId) values (1, 1), (1, 2);

将项目 1 链接到类别 1 和 2。

然后,要找到项目 1 的所有类别,您需要通过 Many:Many 链接表加入,按项目 ID 过滤:

select  cat.id, cat.name 
  from tbcategory cat
  inner join tbProjectCategory prjcat
  on prjcat.tbCategoryId = cat.id
  where prjCat.tbProjectId = 1;

为了简洁起见,我还删除了您的身份列 - 它可以更容易地知道哪些数据记录是链接的。

于 2013-01-16T11:20:38.590 回答
3

我会创建 M:N 关系表,如:

tbProjects2Categories
    IDCategory int;
    IDProject int;

然后就可以查询了:

SELECT c.id, c.name FROM tbCategory c JOIN tbProjects2Categories pc 
                ON c.IDCategory = pc.IDCategory 
                WHERE pc.IDProject = @selectedProjectId;

项目和类别之间的关系将如下所示:

ID项目 | ID类别

     1     |    1
     1     |    2
     1     |    3
     2     |    1
     2     |    3

这意味着在您的原始架构中:

(1,'ProjectOne','Mumbai','1,2,3'); 
(2,'ProjectTwo','USA','1,3');

要完成答案:

在逗号分隔的列表中存储实体关系并不是一个好习惯。您甚至很难拆分该列值并使您的查询正常工作。

于 2013-01-16T11:25:39.690 回答
1

是的,逗号分隔值不是在数据库中存储关系的好方法。您应该再创建一个表来定义两个原始表之间的关系:

create table tbProjectCategory (id int IDENTITY(1,1),projectId int, categoryId int)

然后你可以像这样根据projectId查询它:

select * from tbcategory c
  inner join tbProjectCategory pc on c.id = pc.categoryId
where projectId = 1;

请试试这个小提琴:http ://sqlfiddle.com/#!3/b11acb/2

于 2013-01-16T11:27:40.033 回答