programing

MySQL에 어레이를 저장하는 방법

newsource 2022. 9. 17. 10:01

MySQL에 어레이를 저장하는 방법

MySQL에 테이블이 두 개 있습니다.테이블 사용자에는 다음 열이 있습니다.

아이디 이름. 과일들

fruits'플래시', '플래시', '플래시', '플래시' 등입니다.로, 세컬럼이 .

fruit_name 색. 가격.
사과 빨간. 2
오렌지색 오렌지색 3
----------- -------- ------

어떻게 요?fruits하면 이 은 이 컬럼이 이 의 값을 할 수 .fruit_name두째번 번? ???MySQL에는 어레이 데이터 타입이 없기 때문에 어떻게 하면 좋을까요?

은 여러 과 ""를 입니다.JOIN참조할 수 있습니다.

예를 들어 다음과 같습니다.

CREATE TABLE person (
`id` INT NOT NULL PRIMARY KEY,
`name` VARCHAR(50)
);

CREATE TABLE fruits (
`fruit_name` VARCHAR(20) NOT NULL PRIMARY KEY,
`color` VARCHAR(20),
`price` INT
);

CREATE TABLE person_fruit (
`person_id` INT NOT NULL,
`fruit_name` VARCHAR(20) NOT NULL,
PRIMARY KEY(`person_id`, `fruit_name`)
);

person_fruit는 한 사람이 되어 있으며, 된다.person ★★★★★★★★★★★★★★★★★」fruitsee i i i i이, I.E.

1 | "banana"
1 | "apple"
1 | "orange"
2 | "straberry"
2 | "banana"
2 | "apple"

한 사람과 모든 과일을 회수하고 싶을 때 다음과 같은 작업을 수행할 수 있습니다.

SELECT p.*, f.*
FROM person p
INNER JOIN person_fruit pf
ON pf.person_id = p.id
INNER JOIN fruits f
ON f.fruit_name = pf.fruit_name

SQL에 어레이가 없는 이유는 대부분의 사용자가 실제로 어레이를 필요로 하지 않기 때문입니다.관계형 데이터베이스(SQL은 정확히 관계를 사용하여 작동하며, 대부분의 경우 각 "정보 비트"에 테이블의 한 행을 할당하는 것이 가장 좋습니다.예를 들어, "여기 있는 항목 목록이 필요합니다."라고 생각할 경우, 대신 새 테이블을 만들고 한 테이블의 행과 다른 테이블의 행을 연결합니다.[1] 이렇게 하면 M:N 관계를 나타낼 수 있습니다.또 다른 장점은 링크된 항목이 포함된 행을 복잡하게 만들지 않는다는 것입니다.데이터베이스는 이러한 행을 인덱싱할 수 있습니다.어레이는 일반적으로 인덱싱되지 않습니다.

관계형 데이터베이스가 필요하지 않은 경우 키 값 저장소를 사용할 수 있습니다.

데이터베이스 정규화에 대해 읽어주세요.황금규칙은 [모든]비키[속성]는 키, 전체 키, 키 이외의 것에 대한 사실을 제공해야 한다.어레이는 너무 많은 것을 한다.여기에는 여러 개의 사실이 있으며 순서를 저장합니다(관계 자체와는 관련이 없음).게다가 퍼포먼스는 저조합니다(위 참조).

개인 테이블이 있고 사람들이 전화를 거는 테이블이 있다고 상상해 보세요.이제 각 행에 자신의 전화 통화 목록을 표시하도록 할 수 있습니다.하지만 모든 사람은 다른 많은 것들과 다른 많은 관계를 가지고 있어요.즉, 제 개인 테이블에는 연결된 모든 항목에 대한 배열이 포함되어 있어야 합니까?아니요, 그것은 그 사람의 속성이 아닙니다.

[1] : 링크 테이블이 2열(각 테이블의 기본 키)만 있어도 OK!관계 자체에 추가 속성이 있는 경우에는 이 표에서 열로 표현해야 합니다.

MySQL 5.7은 이제 JSON 데이터 유형을 제공합니다.이 새로운 데이터 유형은 목록, 사전 등 복잡한 데이터를 저장할 수 있는 편리한 새로운 방법을 제공합니다.

즉, 어레이는 데이터베이스를 잘 매핑하지 않기 때문에 객체 관계 맵이 매우 복잡할 수 있습니다.지금까지 사람들은 목록/어레이를 설명하는 테이블을 만들고 각 값을 자체 레코드로 추가하여 MySQL에 목록/어레이를 저장해 왔습니다.테이블에는 열이 2개 또는 3개만 있을 수도 있고 더 많은 열이 포함될 수도 있습니다.이러한 유형의 데이터를 저장하는 방법은 데이터 특성에 따라 달라집니다.

예를 들어 목록에 정적 또는 동적 개수의 엔트리가 포함되어 있습니까?리스트는 계속 작아질까요, 아니면 수백만 장의 레코드로 늘어날까요?이 테이블에는 읽을 것이 많습니까?글씨가 많아요?많은 업데이트?이러한 요인은 모두 데이터 집합을 저장하는 방법을 결정할 때 고려해야 합니다.

또한 Key/Value 데이터 스토어, Cassandra, MongoDB, Redis 등의 Document 스토어도 좋은 솔루션을 제공합니다.데이터가 실제로 어디에 저장되어 있는지(디스크 또는 메모리에 저장되어 있는지)만 알아두면 됩니다.모든 데이터가 동일한 데이터베이스에 있을 필요는 없습니다.일부 데이터는 관계형 데이터베이스에 제대로 매핑되지 않아 다른 곳에 저장해야 하는 이유가 있을 수 있습니다. 또한 디스크에 저장된 데이터의 핫 캐시 또는 세션 등의 사용 후 삭제 저장소로 메모리 내 key:value 데이터베이스를 사용할 수도 있습니다.

Postgres에 어레이를 저장할 수 있습니다.

MySQL에서 JSON 유형을 사용합니다.

위의 답변과는 달리 SQL 표준에는 어레이 유형이 거의 20년간 포함되어 있습니다.MySQL이 어레이 유형을 구현하지 않은 경우에도 유용합니다.

단, 이 예에서는 person과 fruit, person_fruit의 3개의 테이블을 만들고 싶은 경우가 있습니다.

DROP TABLE IF EXISTS person_fruit;
DROP TABLE IF EXISTS person;
DROP TABLE IF EXISTS fruit;

CREATE TABLE person (
  person_id   INT           NOT NULL AUTO_INCREMENT,
  person_name VARCHAR(1000) NOT NULL,
  PRIMARY KEY (person_id)
);

CREATE TABLE fruit (
  fruit_id    INT           NOT NULL AUTO_INCREMENT,
  fruit_name  VARCHAR(1000) NOT NULL,
  fruit_color VARCHAR(1000) NOT NULL,
  fruit_price INT           NOT NULL,
  PRIMARY KEY (fruit_id)
);

CREATE TABLE person_fruit (
  pf_id     INT NOT NULL AUTO_INCREMENT,
  pf_person INT NOT NULL,
  pf_fruit  INT NOT NULL,
  PRIMARY KEY (pf_id),
  FOREIGN KEY (pf_person) REFERENCES person (person_id),
  FOREIGN KEY (pf_fruit) REFERENCES fruit (fruit_id)
);

INSERT INTO person (person_name)
VALUES
  ('John'),
  ('Mary'),
  ('John'); -- again

INSERT INTO fruit (fruit_name, fruit_color, fruit_price)
VALUES
  ('apple', 'red', 1),
  ('orange', 'orange', 2),
  ('pineapple', 'yellow', 3);

INSERT INTO person_fruit (pf_person, pf_fruit)
VALUES
  (1, 1),
  (1, 2),
  (2, 2),
  (2, 3),
  (3, 1),
  (3, 2),
  (3, 3);

그 사람을 일련의 과일에 관련짓고 싶은 경우는, 다음과 같이 표시할 수 있습니다.

DROP VIEW IF EXISTS person_fruit_summary;
CREATE VIEW person_fruit_summary AS
  SELECT
    person_id                                                                                              AS pfs_person_id,
    max(person_name)                                                                                       AS pfs_person_name,
    cast(concat('[', group_concat(json_quote(fruit_name) ORDER BY fruit_name SEPARATOR ','), ']') as json) AS pfs_fruit_name_array
  FROM
    person
    INNER JOIN person_fruit
      ON person.person_id = person_fruit.pf_person
    INNER JOIN fruit
      ON person_fruit.pf_fruit = fruit.fruit_id
  GROUP BY
    person_id;

보기에는 다음 데이터가 표시됩니다.

+---------------+-----------------+----------------------------------+
| pfs_person_id | pfs_person_name | pfs_fruit_name_array             |
+---------------+-----------------+----------------------------------+
|             1 | John            | ["apple", "orange"]              |
|             2 | Mary            | ["orange", "pineapple"]          |
|             3 | John            | ["apple", "orange", "pineapple"] |
+---------------+-----------------+----------------------------------+

5.7.22에서는 어레이를 문자열에서 함께 해킹하는 대신 JSON_ARRAYAGG를 사용합니다.

데이터베이스 필드 유형 BLOB를 사용하여 배열을 저장합니다.

참고 자료: http://us.php.net/manual/en/function.serialize.php

반환값

임의의 위치에 저장할 수 있는 값의 바이트 스트림 표현을 포함하는 문자열을 반환합니다.

이는 늘 바이트를 포함할 수 있는 바이너리 문자열이므로 저장 및 처리해야 합니다.예를 들어 serialize() 출력은 일반적으로 CHAR 또는 TEXT 필드가 아닌 데이터베이스의 BLOB 필드에 저장해야 합니다.

이와 같이 group_Concat을 사용하여 어레이를 저장할 수 있습니다.

 INSERT into Table1 (fruits)  (SELECT GROUP_CONCAT(fruit_name) from table2)
 WHERE ..... //your clause here

여기에서는 바이올린의 예를 나타냅니다.

언급URL : https://stackoverflow.com/questions/17371639/how-to-store-arrays-in-mysql