사전 웹 사이트에 MySQL을 사용하는 것이 나쁜 생각 인 이유는 무엇입니까?


55

사전 항목 (보통 단일 단어)과 그 의미를 다른 언어로 저장할 데이터베이스를 설계하고 설정하려고합니다. 예를 들어, 용어집 테이블 에는 항목정의 가 있어야 하고 각 테이블 레코드에는 저장된 레코드 의 ID 에 대한 참조가 있습니다 Tag(각 항목에는 태그 또는 범주가 있어야 함).

내 데이터에는 구조가 있기 때문에 MySQL과 같은 SQL 데이터베이스를 사용하는 것은 나쁜 생각이 아니라고 생각했습니다. 그러나 사람들은 MongoDB가 성능면에서 훨씬 우수하다고 말합니다.

클라이언트 측에서 애플리케이션은 백엔드가 제공하는 REST API를 사용하는 자동 완성 기능이있는 검색 상자를 제공 할 수 있어야합니다. 이러한 시나리오에서 MySQL을 사용하는 것이 안전합니까? 또는 이것을 위해 다른 솔루션의 MongoDB 또는 ElasticSearch를 사용해야합니까? 이 방법으로 수백 개의 레코드를 저장하고 액세스해야합니다.


79
당신에게 일을 말하는 사람들은 이것에 대해 많은 연구를하지 않았습니다. 어휘가 가장 큰 언어 인 영어는 백만 개 미만의 고유 한 단어를 사용합니다. 이것은 관계형 DB의 성능 기능 영역 내에 있습니다.
TheCatWhisperer 2016 년

25
MySQL이 제대로 작동하지 않을 것이라고 생각할만한 것은 여기에 없습니다. 간단한 조회의 성능은 문제가되지 않으며 해당 경로로 이동해야하는 경우 전체 텍스트 검색이 가능합니다.
GrandmasterB

46
범위가 명확하지 않은 수정되지 않은 명령문으로서 "MongoDB가 성능에 훨씬 우수합니다"와 관련하여 이것은 넌센스입니다. 예를 들어, 명령 줄 도구는 Hadoop 클러스터보다 235 배 더 빠를 수 있습니다 ( 웹 사이트 비만 위기 의 링크에서 찾아 볼 수 있음)를 참조하십시오 .
와일드 카드

82
관계형 데이터베이스가 나쁘고 MongoDB가 빠르기 때문에 더 좋다고 말하는 사람들이 너무 피곤합니다. 그것은 자동차가 나쁘다는 것과 같습니다. 비행기가 더 빨리 여행하기 때문에 비행기를 사용해야합니다. 내 충고는 이런 충고를 무시하는 것입니다.
Brandon

13
@Brandon 슬픈 사실은 "NoSQL이 너무 빠르다"는 주장이 일반적으로 왜 그렇게 좋아야하는지에 대한 이론적 설명으로 이어지지 만 실제로는 실제 시나리오에는 적용되지 않는다는 것입니다. 예를 들어 여기를 참조 하십시오 . 사용 된 벤치 마크 제품군은 오픈 소스이며 github에서도 사용할 수 있습니다. Hell CERN은 OracleDB를 사용하여 PB 데이터를 잘 관리합니다.
Voo

답변:


95

왜 그것이 나쁜 생각인지 말할 수 없습니다. 관계형 데이터베이스가 좋은 아이디어 인 이유는 여러 가지가 있습니다.

  1. 모든 사람이 정의를 위해 사전을 참고하는 것은 아닙니다. 여러 번, 올바른 철자를 찾기 위해 사전이 사용됩니다. 이것은 단지 건초 더미에서 바늘을 찾는 것이 아니라 사용자가 설명 한 것과 비슷한 바늘을 건초 더미에서 검색하고 있음을 의미합니다 (관용구를 사용할 수있는 경우).

    기본 키 조회 만 수행하지는 않습니다. 당신은 키워드 검색을 할거야

  2. 단어는 의미 또는 철자 ( 읽기, 읽기 , 빨간색갈대 ) 로 관련 될 수 있습니다.

    "관련"이라는 단어를 볼 때마다 "관계형 데이터베이스"를 생각하십시오

  3. 속도가 필요한 경우 깨진 관계형 데이터 모델이 아니라 관계형 데이터베이스 위에 캐싱해야합니다.

  4. 적절하게 표준화 된 데이터베이스는 1 차 키 조회 및 검색 속도를 높입니다.

  5. 표준화 된 데이터베이스가 느리다고 말하는 사람들은 이것이 사실 인 경우의 0.1 %를 말합니다. 다른 경우의 99.9 %는 실제로 정규화 된 데이터베이스를 사용하여 성능을 직접 확인 하지 않았 으므로 무시하십시오. 표준화 된 데이터베이스로 작업했습니다. 그것을 사랑하십시오. 돌아가고 싶지 않아 그리고 나는 데이터베이스 사람이 아닙니다. 저는 C # / JavaScript / HTML / Ruby입니다.

  6. 단어에는 기원이 있습니다. 실제로, 같은 언어의 많은 단어가 같은 원점을 가질 수 있는데, 이는 다른 언어의 다른 단어입니다. 예를 들어, résumé (채용 웹 사이트에 업로드하여 향후 7 년 동안 끊임없는 전화 및 이메일을받을 수있는 것)는 프랑스어입니다.

  7. 사전은 또한 어떤 종류의 단어 (명사, 동사, 형용사)를 정의합니다. 이것은 단순한 텍스트가 아닙니다. "명사"라는 의미도 있습니다. 또한 관계형 데이터베이스를 사용하면 "영어의 모든 명사를 제공"과 같은 말을 할 수 있으며 정규화 된 데이터베이스는 외래 키를 사용하고 외래 키에는 인덱스가 있거나 있어야하므로 조회가 간단합니다.

  8. 단어가 어떻게 발음되는지 생각하십시오. 특히 영어에서는 많은 단어가 같은 발음을가집니다 (위의 예제를 읽고 리드하거나 읽거나 빨간색으로 표시하십시오).

    단어의 발음 자체는 다른 단어입니다. 관계형 데이터베이스를 사용하면 발음에 외래 키를 사용할 수 있습니다. 해당 정보는 관계형 데이터베이스에 복제되지 않습니다. SQL이없는 데이터베이스에서는 미친 것처럼 복제됩니다.

  9. 이제 복수 및 단수형 단어에 대해 이야기 해 봅시다. :) "보트"와 "보트"를 생각하십시오. 또는 단어가 "단수"또는 "복수"라는 사실.

  10. 오! 그리고 이제 과거 시제, 현재 시제, 미래 시제 및 현재 분사에 대해 이야기합시다. 영어 등).

    "실행"을 찾으면 실행, 실행, 실행 등 다른 시제가 표시됩니다.

    실제로 "시제"는 또 다른 관계 자체입니다.

  11. 영어는 그렇게 많이하지 않지만 성별은 단어를 정의하는 또 다른 것입니다. 스페인어와 같은 언어는 명사의 주제가 남성인지 여성인지를 정의하는 접미사를 갖습니다. 문장을 위해 빈칸을 채워야하는 경우 많은 언어에서 성별이 매우 중요합니다.

    성별을 결정하기 위해 언어 규칙에 항상 의존 할 수는 없으므로 (스페인어에서 "o"로 끝나는 단어는 남성 / 남성이지만 모든 단어에 해당되는 것은 아닙니다) 남성 또는 여성의 식별 값이 필요합니다. 이것은 표준화 된 데이터베이스가 수백만 개의 레코드에서도 정상적으로 처리하는 또 다른 관계입니다.

단어와 언어 사이의 모든 비틀린 규칙과 관계로 인해이 데이터 저장소를 SQL이 아닌 솔루션이 제공하는 "문서 저장소"로 상상하기가 어렵습니다. 단어와 그 구성 요소 사이에는 관계형 데이터베이스가 유일하게 현명한 해결책이 될 정도로 많은 관계가 존재합니다.


7
# 1의 경우 인덱싱은 종종 비 관계형 오퍼링의 강점 중 하나이며 약점이 아닙니다.
JimmyJames 2016 년

61
@JimmyJames 관계형 시스템이 같은 종류의 인덱스를 사용하지 않는다고 잠시 생각하지 마십시오. 이러한 기술 중 많은 부분이 그 세계에서 개척되었습니다.
Blrfl

14
""관련 "이라는 단어가 나타날 때마다"관계형 데이터베이스 "를 생각하십시오. 동의하지 않습니다. "관계형 데이터베이스"의 "관계형"은 튜플 자체를 나타냅니다. 관련 너무 광범위한 어떤 물을 보유하는이 문장에 대한 용어입니다
gardenhead

12
또한 전통적인 조인을 수행하는 대신 트래버스 관계에 중점을 둔 그래프 데이터베이스 (Neo4j가 떠오를 것)가 있습니다. 많은 사전이 실제로 단어의 웹이라는 점에서 유리할 수 있습니다. 예를 들어 WordNet 프로젝트는 기존 RDMS 대신 자체 그래프와 같은 형식을 사용합니다.
tucuxi 2016

4
나는이 대답을 downvoted 은 "당신이 '관련'이라는 단어를 볼 때마다 '관계형 데이터베이스'를 생각한다"고 말했다. 그건 말도 안돼 . 관계형 데이터베이스를 좋아하지만 관계형 모델 모든 종류의 관계에 적합 하지는 않습니다 . 정규화 된 데이터보기도 완전히 잘못되었습니다. 데이터가 검색되지 않고 복제되지 않기 때문에 데이터를 정규화하면 편집이 최적화 됩니다. (따라서 리포팅 DB가 정규화되지 않는 이유는 차원 모델링 기술과 스타 스키마를 사용하는 것입니다.) 80 개의 공감대는이 사이트에 대한 조언에 대한 모든 우려를 확인합니다.
jpmc26

27

키-값 저장소 (보다 빈약 한 프로그래밍 모델을 제공)를 사용하고 더 많은 구조 (예 : 제 3 언어 추가)가 필요하거나 조인과 관련된보다 복잡한 쿼리를 수행해야하는 경우 키를 재구성하고 데이터를 비정규 화하거나 모든 데이터를 반복하여 필요한 것을 찾는 데 많은 시간을 할애합니다.

관계형 데이터베이스로 시작하면 응용 프로그램의 디자인, 코드를 통해 작업하여 키-값 형식으로 분류하는 대신 응용 프로그램의 자연 데이터 모델에 더 집중할 수 있습니다.

응용 프로그램이 정해지면 다양한 옵션을 측정하여 성능 작업을 수행 할 수 있습니다. 기술을 전환하기 전에 SQL에서 수행해야 할 몇 가지 성능 트릭이 있습니다. 응용 프로그램에 대해 많은 것을 배웠으며 관계형이 자신에게 해를 끼치는 지 여부와 키-값이 데이터 모델에 적합한 지 결정하는 데 훨씬 유리한 위치에있게됩니다.

키-값이 응용 프로그램에 정확히 필요한 것으로 판명되면 관계형 모델에 상당한 투자를 낭비하지 않고 전환 할 수 있지만 다른 방법으로 키-값 모델이 수행하는 작업을 수행하는 데 시간을 낭비 할 수 있습니다 관계형 모델에서 사소한.

도메인과 사용자에 대해 더 많이 배우면서 끊임없이 변화하는 요구 사항에 직면하여 응용 프로그램을 설계, 작성 및 실행하는 데있어 가속기로서 관계형 데이터베이스를 고려하십시오.

수백만 명의 사용자가있는 경우, 시작하기 위해 키-값을 선택한 경우에도 디자인을 리팩터링해야합니다.


13
이 기사 의 에필로그 는 설계를 무효화하는 요구 사항을 변경하는 시나리오를 정확하게 설명합니다. 하나의 (실제) 응용 프로그램을 "MongoDB의 완벽한 사용 사례"로 설명하지만, RDBMS에서 구현하기에 사소한 요구 사항이 비교적 적은 양의 변경으로 인해 상당한 양의 작업이 필요하고 이동 한 방법을 설명합니다. (이 기사의 앞부분에서 설명했듯이) Mongo의 좋은 사용 사례는 아닙니다.
데릭 엘 킨스

5
Sarah의 MongoDB 기사는 정확히 우리가 그것을 사용하여 구축 한 1.0 제품으로 겪은 내용입니다. 1.1로 우리는 Postgres를 사용했습니다.
Joe

@ DerekElkins, 슈퍼 레퍼런스, thx!
Erik Eidt 2016

1
"하지만 RDBMS에서 구현하기가 쉽지 않은 요구 사항의 상대적으로 작은 변경 사항을 설명하지만 그 반대의 경우도 마찬가지입니다. 우리는 직장에서 RDBMS를 사용하고 MongoDB에서 해결하기 쉽지 않은 문제에 직면합니다. 이상하게도 소프트웨어 요구 사항이 항상 사용하는 도구의 기능에 완벽하게 매핑되는 것은 아닙니다.
NPSF3000

@ NPSF3000, 블로그 또는 그와 관련된 텍스트와 같은 참조를 인용 할 수 있다면 정말 좋을 것입니다!
Erik Eidt 2016 년

10

이 데이터베이스의 경우 성능에 큰 차이가 없을 것입니다. 아마도 표준 RDBMS는 끔찍한 생각이 아닙니다. 아마도 주어진 항목의 쓰기보다 훨씬 더 많은 읽기가 있어야하기 때문입니다. 이것에 대한 성능은 기본 드라이버가 아닌 것 같습니다. 응용 계층에서의 캐싱도 이러한 문제를 완화합니다.

다른 고려 사항은 복제 및 복원력입니다. 관계형 데이터베이스는 단일 인스턴스를 중심으로 설계되는 경향이 있습니다. CAP 정리를 읽고 가장 중요한 것을 고려해야합니다.


CAP는 비교적 일반적인 웹앱에 어떻게 적용됩니까? 키트에 따라 수천 개의 인바운드 연결을 유지할 수 있으며 페이지 캐싱 계층이 매그너 튜드 순서로이를 증가시킬 수 있습니다. CAP은 분산 시스템이 목표를 달성 하는 유일한 방법 일 때 고려해야 할 사항이되기 시작 합니다.
Ben

2
@Ben Resiliency는 자체 목표입니다. 단일 장애 지점이 애플리케이션에 적합하지 않은 경우 분산 솔루션은 솔루션을 제공합니다. 비 RDBMS 솔루션은이 방향으로 향하는 경향이 있습니다. 고려해야 할 것은 단순히 볼륨이 아닙니다. 지연 및 가용성이 우려됩니다. 99.9 % 가동 시간이 필요한 경우 일년에 약 9 시간 동안 다운 될 수 있으며 하나의 데이터베이스에서 데이터를 잃는 것은 치명적이므로 복제 / 백업 / 스냅 샷을 고려해야합니다. 반드시 일을 단순화한다고 생각하는 것은 잘못된 것입니다.
JimmyJames

2

이러한 NoSQL 데이터베이스는 처음부터 항상 좋은 생각처럼 들리지만, 예를 들어 키워드를 가치 (또는 일부)로 조회해야하는 경우와 같은 문제를 처리 할 때 문제가 발생할 수 있습니다.

관계형 데이터베이스와 함께 시작한 다음 나중에 비정규 화하는 것이 더 안전한 옵션입니다. MySQL은 이런 종류의 목적 (텍스트 기반 검색을 사용하는 간단한 관계형 데이터베이스)에 적합합니다. 이런 종류의 데이터로 어려움을 겪는 유스 케이스는 그리 많지 않습니다. 인덱스가 올바르게 설정되어 있는지 확인하면 NoSQL 데이터베이스와 비슷한 수준 (또는 텍스트 검색을 수행 할 때 더 나은 수준)에서 수행되며 앱 논리를 수정하지 않고도 유연성을 제공 할 수 있습니다. 구체적인 데이터 구조에 바인딩됩니다.

데이터의 가장 일반적인 사용법을 찾은 후 (성능 요구를 충족하지 않는 경우)로드 및 검색 할 수있는 설정된 형식으로 출력하여 데이터를 비정규화할 수 있습니다. NoSQL 스키마.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.