Sobes.tech
Junior

SQLде көптөн-көпкө байланышты (M2M) кантип ишке ашыруу керек?

sobes.tech AI

AIден жооп

SQLда "көпкө көп" мамилени ишке ашыруу үчүн аралык (байланыштыргыч) таблица колдонулат. Бул таблица эки сырткы ачкычты камтыйт, алар эки таблицанын биринчи ачкычтарына шилтеме кылат, жана алардын ортосунда байланыш түзүлөт.

Айтайын дегенде, бизде authors (жазуучулар) жана books (китептер) таблицалары бар деп эсептейли, жана биз байланыш түзгүбүз келет, анда бир жазуучу көп китеп жазса, жана бир китеп көп жазуучудан болушу мүмкүн.

  1. Объект таблицаларын түзүү: негизги таблицаларды түзөбүз authors жана books.

    -- Жазуучулардын таблицасы
    CREATE TABLE authors (
        author_id INT PRIMARY KEY,
        name VARCHAR(255) NOT NULL
    );
    
    -- Китептердин таблицасы
    CREATE TABLE books (
        book_id INT PRIMARY KEY,
        title VARCHAR(255) NOT NULL
    );
    
  2. Байланыштыргыч таблицаны түзүү: author_book таблицасын түзөбүз, ал жазуучулар менен китептерди байланыштырат. Бул таблица эки сырткы ачкычты камтыйт, алар author_id жана book_idке шилтеме кылат.

    -- Много-ка-Много байланыш үчүн байланыштыргыч таблица
    CREATE TABLE author_book (
        author_id INT,
        book_id INT,
        PRIMARY KEY (author_id, book_id), -- Композиттик негизги ачкыч
        FOREIGN KEY (author_id) REFERENCES authors(author_id),
        FOREIGN KEY (book_id) REFERENCES books(book_id)
    );
    
    • PRIMARY KEY (author_id, book_id) ар бир (жазуучу, китеп) парын уникалдуу кылат, дублдештирүүнү алдын алат.
    • FOREIGN KEY чектөөлөрү референциалдык бүтүндүктү камсыздайт, author_id жана book_id authors жана books таблицаларындагы бар жазууларына шилтеме кылганын кепилдейт.
  3. Маалыматтарды кошуу: Маалыматтарды таблицаларга кошобуз.

    -- Жазуучулардын таблицасына маалыматтарды кошуу
    INSERT INTO authors (author_id, name) VALUES
    (1, 'Author A'),
    (2, 'Author B'),
    (3, 'Author C');
    
    -- Китептердин таблицасына маалыматтарды кошуу
    INSERT INTO books (book_id, title) VALUES
    (101, 'Book 1'),
    (102, 'Book 2'),
    (103, 'Book 3');
    
    -- Байланыштыргыч таблицага маалыматтарды кошуу (жазуучулар менен китептердин ортосундагы байланыштар)
    INSERT INTO author_book (author_id, book_id) VALUES
    (1, 101), -- Author A Book 1 жазган
    (1, 102), -- Author A Book 2 жазган
    (2, 101), -- Author B Book 1 жазган
    (3, 103), -- Author C Book 3 жазган
    (1, 103); -- Author A Book 3 жазган
    
  4. Маалыматтарды суроо: Байланыштуу маалыматтарды алуу үчүн JOIN операциялары колдонулат.

    • Белгилүү бир автор жазган китептерди алуу:

      SELECT b.title
      FROM books b
      JOIN author_book ab ON b.book_id = ab.book_id
      WHERE ab.author_id = 1; -- ID = 1 болгон автор жазган китептер
      
    • Белгилүү бир китептин авторлорун алуу:

      SELECT a.name
      FROM authors a
      JOIN author_book ab ON a.author_id = ab.author_id
      WHERE ab.book_id = 101; -- ID = 101 болгон китептин авторлору
      
    • Бардык китептер жана алардын авторлору:

      SELECT b.title, a.name
      FROM author_book ab
      JOIN books b ON ab.book_id = b.book_id
      JOIN authors a ON ab.author_id = a.author_id;
      

author_book таблицасы M2M реализациясынын ачкычы болуп саналат, анткени ал бардык байланышкан объекттердин парларын сактайт.