0

我有一个sections 表和一个items 表。

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

我考虑过将 id 列表存储为逗号分隔的字符串,问题是我看不到任何方法来检查项目是否在 sql 查询的给定部分中。我在这里看到的唯一选项是选择整个表,并在 php.ini 中解析字符串。不用说,有 1000 件物品,这不是一个好主意。

有没有更好的方法来“链接”具有多个部分的项目,并且能够轻松选择给定部分 ID 的所有项目?

4

9 回答 9

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
于 2008-09-28T14:49:45.847 回答
2

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

来自维基百科

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

于 2008-09-28T14:47:35.353 回答
0

您需要第三个表 itemsPerSection,其主键由 itemid 和 sectionid 组成,这样您就可以建立 N 对 N 关系并且非常容易搜索。

所以:

Items   -   ItemsPerSection   -   Secion
itemid  <->   itemid
             sectionid        <->   sectionid
于 2008-09-28T14:46:11.190 回答
0

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

于 2008-09-28T14:47:03.827 回答
0

我知道的方式(但我不是一个经验丰富的数据库设计师!),我在几个数据库中看到,是有第三个表:它有两列,一列是 section 表的 ID,一列是 section 表的 ID。项目表。
它无需太多成本就可以在这些条目之间创建关系,如果您从两个 ID 中创建复合索引,则可以进行快速搜索。

于 2008-09-28T14:48:45.460 回答
0

你说的是多对多的关系。以规范化的形式,最好用第三个表处理:

items
sections
itemsections

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

于 2008-09-28T14:49:53.693 回答
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
于 2008-09-28T14:51:09.667 回答
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

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

祝你好运 :)

于 2008-09-28T14:51:09.713 回答
-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

于 2008-09-28T14:51:26.980 回答