mysql db에 직렬화된 데이터를 저장할 때 사용해야 하는 열 유형을 선택하십시오.
mysql db에 직렬화된 데이터를 저장할 때 사용해야 하는 열 유형을 선택하십시오.바이너리, blob, text를 사용할 수 있다는 거 알아.무엇이 최선이고 그 이유는 무엇입니까?
편집: 시리얼화된 데이터를 저장하는 것이 좋지 않다는 것을 알고 있습니다.하지만 이 한 가지 경우에 해야 합니다.그냥 저를 믿고 답이 있으면 질문에 집중해주세요.감사합니다!
답변: 텍스트는 많은 DBMS에서 권장되지 않으므로 제한이 높은 blob 또는 varchar를 사용하는 것이 좋습니다(blob의 경우 varchar와 텍스트의 큰 문제인 인코딩 문제가 발생하지 않습니다).
또한 MySQL 포럼에서 이 스레드에서 지적한 바와 같이 하드 드라이브는 소프트웨어보다 저렴하기 때문에 먼저 소프트웨어를 설계하고 작동시키는 것이 좋습니다. 그 후에 공간이 문제가 되는 경우에만 이러한 측면을 최적화할 수 있습니다.따라서 너무 일찍 열의 크기를 최적화하지 말고 먼저 크기를 크게 설정하는 것이 좋습니다(또한 보안 문제를 방지할 수 있습니다).
다양한 코멘트에 대해서:SQL 광신도 심해요SQL 및 관계형 모델을 매우 좋아하지만 이러한 모델에는 함정도 있습니다.
시리얼화된 데이터를 그대로 데이터베이스에 저장하면(JSON 또는 XML 형식의 데이터 저장 등) 몇 가지 이점이 있습니다.
- 데이터를 보다 유연하게 포맷할 수 있습니다. 즉, 필드 추가 및 삭제, 필드 지정 변경 등입니다.
- 오브젝트 모델과의 임피던스 미스매치가 적어집니다.데이터를 취득한 후 프로그램 객체의 구조와 관계형 데이터베이스 구조 간에 데이터를 처리 및 변환해야 하는 경우와 비교하여 프로그램에 있는 그대로 데이터를 저장하고 가져옵니다.
그 밖에도 많은 장점이 있기 때문에 팬보이즘은 금물입니다.관계형 데이터베이스는 훌륭한 도구입니다만, 그 외의 툴은 사용하지 말아 주세요.도구가 많으면 많을수록 좋습니다.
구체적인 사용 예로는 JSON 데이터 열(속성)이 개별적으로 선택되지 않고 올바른 레코드가 이미 선택되었을 때만 사용되는 레코드의 추가 파라미터를 저장하기 위해 데이터베이스에 JSON 필드를 추가하는 경향이 있습니다.이 경우에도 관계형 컬럼으로 레코드를 판별할 수 있으며 올바른 레코드가 선택되면 추가 파라미터를 원하는 용도로 사용할 수 있습니다.
따라서 양쪽의 장점(속도, 직렬화 가능성 및 구조적 유연성)을 유지하려면 몇 개의 표준 릴레이셔널 열을 사용하여 행을 구별하고 직렬화된 데이터를 삽입하는 blob/varchar 열을 사용하십시오.일반적으로 하나의 키에 필요한 열은 2~3개뿐이므로 큰 오버헤드가 되지 않습니다.
또한 Postgre에 관심이 있을 수 있습니다.현재 JSON 데이터형을 가진 SQL과 PostSQL 프로젝트는 JSON 필드를 관계형 열로 직접 처리합니다.
얼마나 보관할 예정입니까?MySQL 문서에서 문자열 유형의 사양과 크기를 확인하십시오.여기서 중요한 것은 이 열을 인덱싱하는 데 신경 쓰지 않지만 JSON을 읽을 수 없기 때문에 이 열이 오버플로우되거나 잘리는 것을 원하지 않는다는 것입니다.
- 작은 텍스트 L < 2^8
- 텍스트 L < 2^16
- 중간 텍스트 L < 2 ^24
- 긴 텍스트 L < 2^32
여기서 L은 문자 길이입니다.
일반 텍스트로도 충분하지만 더 많이 저장할 경우에는 더 크게 확장하십시오.단, 이 경우 DB에 저장하지 않을 수 있습니다.
@Twisted Pear가 언급하는 길이 제한이 좋은 이유입니다.
, 「 」, 「 」라고 것도 고려해 주세요.TEXT
문자 집합이 관련지어져 있는 반면,BLOB
데이터 타입은 그렇지 않습니다.에는 raw를 사용하는 것이 .BLOB
TEXT
는 아직 합니다.BLOB
문자 집합을 고려한 SQL 작업은 수행할 수 없습니다. SQL sql sql sql sql sql sql sql 。그러나 SQL에서 알 수 없는 구조를 가진 직렬화된 데이터이기 때문에 고객님의 경우에는 문제가 되지 않을 수 있습니다.필요한 것은 바이트를 저장하고 바이트를 가져오는 것뿐입니다.이치노
또, 사용법에도 문제가 있었습니다.LONGBLOB
★★★★★★★★★★★★★★★★★」LONGTEXT
특정 클라이언트 라이브러리(예: PHP)를 사용합니다.클라이언트는 가능한 한 큰 데이터 타입의 버퍼를 할당하려고 하기 때문입니다.이러한 버퍼가 가져올 때까지, 어느 행의 컨텐츠가 얼마나 큰지 알 수 없습니다.이로 인해 PHP가 4GB 버퍼를 할당하려고 할 때 불꽃이 튀었습니다.어떤 고객을 이용하고 있는지, 같은 행동을 하고 있는지 알 수 없습니다.
회피책: 사용MEDIUMBLOB
아니면 그냥BLOB
이러한 타입이 시리얼화된 데이터를 저장하기에 충분한 경우.
이렇게 하지 말라고 하는 문제에 대해서는 (나는 SQL 옹호자임에도 불구하고) 말하지 않을 것입니다.SQL 식을 사용하여 직렬화된 데이터 내의 개별 요소에 대한 작업을 수행할 수 없습니다. 그러나 이는 귀사의 목적이 아닙니다.이러한 데이터를 데이터베이스에 저장함으로써 얻을 수 있는 이점은 다음과 같습니다.
- 시리얼화된 데이터를 다른 관계형 데이터와 관련짓습니다.
- 트랜잭션 범위, COMMIT, Rollback에 따라 시리얼화된 데이터를 저장 및 가져오는 기능.
- 모든 관계형 데이터와 비관계형 데이터를 한 곳에 저장하여 슬레이브로의 복제, 백업 및 복원 등을 쉽게 수행할 수 있습니다.
긴 텍스트
Wordpress는 포스트메타 테이블에 LONGTEXT로 직렬화된 데이터를 저장합니다. Wordpress 데이터베이스는 열의 데이터 유형을 연구하기에 좋은 장소라고 생각합니다.
파티에 늦는 경우가 있습니다만, 시리얼화된 오브젝트에 관한 php.net 문서에는 다음과 같이 기재되어 있습니다.
이는 늘 바이트를 포함할 수 있는 바이너리 문자열이므로 저장 및 처리해야 합니다.예를 들어 serialize() 출력은 일반적으로 CHAR 또는 TEXT 필드가 아닌 데이터베이스의 BLOB 필드에 저장해야 합니다.
출처 : http://php.net/manual/en/function.serialize.php
도움이 됐으면 좋겠네요!
MySQL 5.7.8에서 MySQL은 네이티브 JSON 데이터 유형을 지원합니다.MySQL 매뉴얼
직렬화된 데이터가 데이터베이스에서 저장 및 복원되는 것 외에 다른 용도가 없는 경우 이 방법은 사용하지 않을 수 있습니다.
일반적으로 직렬화된 데이터에는 여러 개의 필드가 있으며, 이 필드는 데이터베이스에 별도의 열로 저장되어야 합니다.일반적으로 직렬화된 데이터의 모든 항목이 별도의 열이어야 합니다.그 칼럼들 중 일부는 자연스럽게 핵심 분야가 될 것이다.삽입이 발생한 날짜+시간, 담당 사용자 등을 나타내기 위해 데이터 외에 추가 컬럼이 합리적으로 추가될 수 있습니다.
검색 결과:
varchar(5000)
최적의 사이즈와 속도의 밸런스를 실현합니다.또, 레일 3의 시리얼라이즈 데이터(변동 바이너리)에 의해서 시리얼라이즈 에러가 간헐적으로 발생하고 있습니다.
언급URL : https://stackoverflow.com/questions/5544749/what-column-type-should-be-used-to-store-serialized-data-in-a-mysql-db
'programing' 카테고리의 다른 글
SSR에서 Vuex와 함께 vue-instantsearch를 사용하는 방법 (0) | 2022.09.25 |
---|---|
HAVING 절의 다중 집계 함수 (0) | 2022.09.25 |
마이그레이션을 사용하여 라라벨의 열 이름을 변경하려면 어떻게 해야 합니까? (0) | 2022.09.25 |
vue.js의 로그아웃 버튼으로 main.js의 인스턴스에 액세스합니다. (0) | 2022.09.25 |
문자열이 PHP의 이메일 주소인지 확인합니다. (0) | 2022.09.25 |