다대다 관계 예제
여기와 구글에서 MYSQL 다대다 관계의 예를 찾지 못했습니다.제가 보고 있는 것은 php+mysql로 데이터베이스의 결과를 보여주는 매우 간단한 예를 보는 것입니다.아주 간단한 예문을 쓸 수 있는 사람이 있습니까?
예: 대학의 학생과 과정.주어진 학생은 여러 과목을 들을 수 있고, 자연스럽게 한 과목은 보통 많은 학생들을 가질 것입니다.
예제 표, 단순 설계:
CREATE TABLE `Student` (
`StudentID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`FirstName` VARCHAR(25),
`LastName` VARCHAR(25) NOT NULL,
PRIMARY KEY (`StudentID`)
) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci
CREATE TABLE `Course` (
`CourseID` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
`Code` VARCHAR(10) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL,
`Name` VARCHAR(100) NOT NULL,
PRIMARY KEY (`CourseID`)
) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci
CREATE TABLE `CourseMembership` (
`Student` INT UNSIGNED NOT NULL,
`Course` SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY (`Student`, `Course`),
CONSTRAINT `Constr_CourseMembership_Student_fk`
FOREIGN KEY `Student_fk` (`Student`) REFERENCES `Student` (`StudentID`)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `Constr_CourseMembership_Course_fk`
FOREIGN KEY `Course_fk` (`Course`) REFERENCES `Course` (`CourseID`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB CHARACTER SET ascii COLLATE ascii_general_ci
과정에 등록된 모든 학생 찾기:
SELECT
`Student`.*
FROM
`Student`
JOIN `CourseMembership` ON `Student`.`StudentID` = `CourseMembership`.`Student`
WHERE
`CourseMembership`.`Course` = 1234
지정된 학생이 수강한 모든 과정 찾기:
SELECT
`Course`.*
FROM
`Course`
JOIN `CourseMembership` ON `Course`.`CourseID` = `CourseMembership`.`Course`
WHERE
`CourseMembership`.`Student` = 5678
다음은 관련된 SQL의 빠르고 더러운 예입니다.저는 php로 개념을 흐릴 필요가 없다고 생각합니다.그냥 다른 것처럼 세트를 회수하세요.
이 예에는 많은 이름과 색상이 있습니다.사람들은 둘 이상의 좋아하는 색을 가질 수 있고, 많은 사람들은 같은 색을 가질 수 있습니다.그래서 많은 사람들이.
***** Tables **********
person
--------
id - int
name - varchar
favColor
-------------
id - int
color - varchar
person_color
------------
person_id - int (matches an id from person)
color_id - int (matches an id from favColor)
****** Sample Query ******
SELECT name, color
FROM person
LEFT JOIN person_color ON (person.id=person_id)
LEFT JOIN favColor ON (favColor.id=color_id)
****** Results From Sample Query *******
Name - Color
---------------
John - Blue
John - Red
Mary - Yellow
Timmy - Yellow
Suzie - Green
Suzie - Blue
etc...
도움이 되셨어요?
mysql> SELECT * FROm products;
+----+-----------+------------+
| id | name | company_id |
+----+-----------+------------+
| 1 | grechka | 1 |
| 2 | rus | 1 |
| 3 | makaronu | 2 |
| 4 | yachna | 3 |
| 5 | svuniacha | 3 |
| 6 | manka | 4 |
+----+-----------+------------+
6 rows in set (0.00 sec)
mysql> SELECT * FROm company;
+----+----------+
| id | name |
+----+----------+
| 1 | LVIV |
| 2 | KIEV |
| 3 | KHarkiv |
| 4 | MADRID |
| 5 | MILAN |
| 6 | KOR |
+----+----------+
6 rows in set (0.00 sec)
mysql> SELECT * FROm many_many;
+------------+---------+
| product_id | city_id |
+------------+---------+
| 1 | 1 |
| 1 | 3 |
| 2 | 3 |
| 1 | 2 |
| 1 | 4 |
| 2 | 4 |
| 2 | 1 |
| 3 | 1 |
+------------+---------+
8 rows in set (0.00 sec)
mysql> SELECT products.name,company.name FROM products JOIN many_many ON many_
ny.product_id =products.id JOIN company ON company.id= many_many.city_id;
+----------+---------+
| name | name |
+----------+---------+
| grechka | LVIV |
| grechka | KHarkiv |
| grechka | KIEV |
| grechka | MADRID |
| rus | KHarkiv |
| rus | MADRID |
| rus | LVIV |
| makaronu | LVIV |
+----------+---------+
8 rows in set (0.00 sec)
SELECT a.a_id, b.b_id, b.b_desc,
CASE WHEN x.b_id IS NULL THEN 'F' ELSE 'T' END AS selected
FROM a
CROSS JOIN b
LEFT JOIN x ON (x.a_id = a.a_id AND x.b_id = b.b_id)
WHERE (a.a_id = 'whatever')
접합 테이블을 사용하여 다대다 관계를 사용할 수 있습니다.
CREATE TABLE Student (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
CREATE TABLE Course (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
CREATE TABLE Student_Course (
student_id INT NOT NULL,
course_id INT NOT NULL,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES Student(id),
FOREIGN KEY (course_id) REFERENCES Course(id)
);
INSERT INTO Student (name) VALUES ('Mike');
INSERT INTO Student (name) VALUES ('Jack');
INSERT INTO Student (name) VALUES ('Henry');
INSERT INTO Course (name) VALUES ('Math');
INSERT INTO Course (name) VALUES ('Science');
INSERT INTO Course (name) VALUES ('History');
INSERT INTO Student_Course (student_id, course_id) VALUES (1, 1);
INSERT INTO Student_Course (student_id, course_id) VALUES (1, 2);
INSERT INTO Student_Course (student_id, course_id) VALUES (2, 2);
INSERT INTO Student_Course (student_id, course_id) VALUES (2, 3);
INSERT INTO Student_Course (student_id, course_id) VALUES (3, 1);
INSERT INTO Student_Course (student_id, course_id) VALUES (3, 2);
INSERT INTO Student_Course (student_id, course_id) VALUES (3, 3);
데이터베이스의 테이블 간에 다대다 관계를 설정하는 것은 일반적으로 효율적인 데이터 처리 및 데이터 무결성을 보장하고 데이터베이스 정규화 및 데이터 분석 작업을 위해 수행됩니다.
관계형 데이터베이스는 두 테이블 간에 직접적인 다대다 관계를 구현할 수 없으므로 이러한 관계를 처리하는 것은 위협적인 작업이 될 수 있습니다.
둘 이상의 테이블 사이의 관계형 데이터베이스에서 다대다 관계를 설정해야 하는 경우 가장 간단한 방법은 연결 테이블을 사용하는 것입니다.
브리지 테이블 또는 연관 테이블이라고도 하는 데이터베이스의 연결 테이블은 각 데이터 테이블의 기본 키를 참조하여 테이블을 함께 연결합니다.이것은 견과류 껍질의 접합 테이블입니다.
언급URL : https://stackoverflow.com/questions/2923809/many-to-many-relationships-examples
'programing' 카테고리의 다른 글
float64 with 팬더 to_csv (0) | 2023.08.22 |
---|---|
ASP.NET MVC3 부분 뷰 명명 규칙 (0) | 2023.08.22 |
내보내기-CSV 내보내기 길이만 이름이 아님 (0) | 2023.08.22 |
git 원격 분기 추가 (0) | 2023.08.22 |
Twitter 부트스트랩 - 탭 - URL이 변경되지 않음 (0) | 2023.08.22 |