代码之家  ›  专栏  ›  技术社区  ›  Fire Lancer

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

  •  0
  • Fire Lancer  · 技术社区  · 16 年前

    我有一个分区表和一个项目表。

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

    9 回复  |  直到 16 年前
        1
  •  3
  •   Adam Bellaire    16 年前

    您需要一个中间查找表:

    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
    
        2
  •  2
  •   Sklivvz    16 年前

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

    Wikipedia :

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

        3
  •  0
  •   mmaibaum    16 年前

    您需要第三个表,称为连接表,它提供了N到N的关系,其中有两个外键指向父表。

        4
  •  0
  •   albertein    16 年前

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

    Items   -   ItemsPerSection   -   Secion
    itemid  <->   itemid
                 sectionid        <->   sectionid
    
        5
  •  0
  •   PhiLho    16 年前

    我知道(但我不是一个经验丰富的数据库设计师!),并且我在几个数据库中看到了第三个表:它有两个列,一个带有sections表的id,一个带有items表的id。
    它可以在这些条目之间创建一个关系,而无需花费太多成本,如果您使用两个ID创建一个复合索引,则可以快速搜索。

        6
  •  0
  •   paxdiablo    16 年前

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

    items
    sections
    itemsections
    

        7
  •  0
  •   Dan Aditi    16 年前

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

    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
    

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

    祝你好运:)

        8
  •  0
  •   cagcowboy    16 年前

    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
    
        9
  •  -1
  •   Lasar    16 年前

    您可以在一个字段中存储多个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