Sql设计问题 - 多个部分中的项目

时间:2008-09-28 14:43:35

标签: sql database-design

我有一个部分表和一个物品表。

问题是每个项目可能在一个或多个部分中,因此每个项目的简单“section_id”将不起作用,并且sql没有办法存储数组,我可以说“WHERE 5 in section_ids” ...

我已经考虑将id列表存储为逗号分隔的字符串,问题是我看不到然后检查某个项是否在sql查询的给定部分中。我在这里看到的唯一选择是选择整个表,并在php中解析字符串。毋庸置疑,1000件商品并不是一个好主意。

是否有更好的方法将项目与多个部分“关联”,并且能够轻松选择给定部分ID的所有项目?

9 个答案:

答案 0 :(得分:3)

您需要一个中间查找表:

CREATE TABLE item_in_section (item_id int, section_id int)

(我猜测你的密钥类型,使用适当的密钥类型)。

要查找某个部分中的项目:

SELECT item.* from item, item_in_section WHERE item_in_section.item_id = item.item_id AND item_in_section.section_id = X GROUP BY item_id

查找项目所属的部分

SELECT section.* from section, item_in_section WHERE item_in_section.section_id = section.section_id AND item_in_section.item_id = Y GROUP BY section_id

答案 1 :(得分:2)

为了表示多对多关系,您需要一个包含SectionId和ItemId的支持表。两者都应该是它们各自表的外键,并且该表的主键应该都是列。

来自Wikipedia

  

因为大多数DBMS仅支持一对多关系,所以有必要通过第三交汇表物理地实现这种关系,例如,AB具有两个一对多关系A - > AB和B - > AB。在这种情况下,AB的逻辑主键由两个外键(即A和B的主键的副本)组成。

答案 2 :(得分:0)

你需要第三个表itemsPerSection,主键由itemid和sectionid组成,这样你就可以有一个N到N的关系,并且它很容易搜索。

所以:

Items   -   ItemsPerSection   -   Secion
itemid  <->   itemid
             sectionid        <->   sectionid

答案 3 :(得分:0)

您需要第三个表,称为联结表,它提供N到N的关系,其中2个外键指向父表。

答案 4 :(得分:0)

我知道的方式(但我不是一个经验丰富的数据库设计师!),而且我在几个数据库中看到的是第三个表:它有两列,一列是sections表的ID,一列是项目表的ID 它可以在不增加成本的情况下在这些条目之间创建关系,如果您从两个ID中创建复合索引,则允许快速搜索。

答案 5 :(得分:0)

你在谈论多对多的关系。以标准化形式,最好用第三个表格处理:

items
sections
itemsections

itemsections中的每一行都有一个item id和一个section id。对于正常的一对多关系,这不是必需的,但它是您正在看的内容的标准做法。

答案 6 :(得分:0)

您需要一个交叉表位于两者之间,即一个描述哪些项目在哪些部分中的表。

像...这样的东西。

CREATE TABLE item_sections (
  ID datatype
  ITEM_ID datatype,
  SECTION_ID datatype);

然后,您需要加入表格以获取数据......

SELECT items.*
FROM   items, item_sections
WHERE  items.id = item_sections.item_id
and    item_sections.section_id = the-id-of the-section-you-want

答案 7 :(得分:0)

您需要将节关系存储在第二个表中。这是一个非常简单的例子:

CREATE TABLE foos (
    id              INTEGER,
    name            VARCHAR
)

CREATE TABLE foo_sections (
    foo_id              INTEGER,
    section_name        VARCHAR,
)

-- Add some 'foos'
INSERT INTO foos (1, 'Something');
INSERT INTO foos (2, 'Something Else');

-- Add some sections for each 'foo'
INSERT INTO foo_sections (1, 'Section One');
INSERT INTO foo_sections (1, 'Section Two');
INSERT INTO foo_sections (2, 'Section One');

-- To get all the section names for a specific 'foo' record:
SELECT section_name FROM foo_sections WHERE foo_id = 1
> Section One
> Section Two

当然,在第二个表格中,您可以存储对第三个“部分”表格的引用,但为了清晰起见,我将其排除在外。

祝你好运:)

答案 8 :(得分:-1)

您可以在字段中存储多个ID,用逗号分隔,然后使用FIND_IN_SET命令:

SELECT * FROM items WHERE FIND_IN_SET(5, section_id);

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set