무엇을 사용해야합니까? 문자열 또는 15 개의 정수 필드?


9

15 개의 시험 점수를 저장해야하는 학생 추적 프로그램을 개발 중입니다.

산술 연산 수행과 같은 목적으로 마크를 문자열로 저장하고 필요할 때 분할 할 수 있습니다. 그러나 가능한 한 많은 성능이 필요합니다.

어떤게 더 좋아? 단일 문자열 필드 또는 15 개의 개별 int 필드?


"15 개의 시험 점수"– 단일 시험의 객관식 선택 또는 15 개의 시험 점수처럼?
rfusca

15 개의 시험 점수
mike

1
데이터베이스 유형 (인덱싱과의 전통적 관계?) 및 데이터 액세스 및 사용 패턴에 대한 요구 사항에 대한 추가 정보가 없으면 어떤 디자인을 사용해야하며 어떻게 수행 할 것인지 말하기가 어렵습니다.
케이드 룰

답변:


27

이미 분할 및 컴퓨팅에 대해 이야기하고 있다면 이것을 배열로 저장 하지 마십시오 .

관계 이론과 전통적인 정규화 규칙 및 교리에 관계없이 최소한의 유연성을 제공하는 디자인입니다.

각 시험 결과를 한 줄로 만드십시오.

나는 모든 것을 예상하려고하지는 않지만 이보다 세분화되고 (정상화 된) 매우 많은 공간이 필요합니다. 비싼 디자인으로 인해 현재 필요하거나 필요하지 않을 수도 있습니다. 앞으로 필요하지 않을 수도 있습니다 :

  • 최고와 최저 결과를 버리고? 배열을 슬라이스하고 정렬해야합니다.

  • 평균? 당신은 그것을 슬라이스하고 총을해야합니다

  • 학생들의 시험에 의한 시험 결과 분석? 당신은 슬라이스하고 피벗해야합니다

  • 계산을 위해 정렬 (또는 영국 GCSE, 7 As 및 2B 위치)? 당신은 슬라이스하고 정렬해야합니다

이 모든 슬라이싱 및 정렬은 인덱스 화 된 정규화 된 디자인에서 매우 저렴합니다.


4
내가 말하려고했던 것이지만 당신은 더 잘 말했습니다! 하나의 문자열에 여러 값을 저장하는 것은 모든 데이터베이스에서 가능한 최악의 디자인 선택 중 하나입니다.
HLGEM

+1 내 설명이 훌륭합니다. 나는 너무 간결한 경향이 있습니다 .
rfusca

12

성과 측면에서 점수가 좋은 승자는 다음과 같이 수치 적으로 저장합니다.

create table test_scores
(
  student_id int,
  test_id int,
  score int
);

쿼리, 업데이트 및 추가가 쉽고 집계를 매우 쉽고 빠르게 수행 할 수 있습니다. "이 정보를 분리해야하는 문자열로 저장"또는 "열에 저장"을 선택하면 RDBMS에서 대부분의 유스 케이스에서 거의 항상 "열에 저장"이됩니다.


항상 동일한 15 개의 시험 세트 인 경우 비정규 화 된 (15 열) 저장하는 것이 처리 속도가 더 빠를 수 있습니다. 질문, 의도적으로 정수 데이터 유형을 제안 했습니까?
Edward Dortland

또한, 한 학생의 15 개 시험마다 현재 학생 ID와 시험 ID 추가의 15 배를 저장합니다.
Edward Dortland

1
여기에서 바이올린 -sqlfiddle.com/#!1/f7343/10
rfusca

6
@EdwardDortland는 그렇지 않을 때까지 항상 15입니다.
거기서부터

1
@ EdwardDortland : 계산은 괜찮습니다. 자, 당신은 당신이 필요로하는 인덱스를 위해 그들을 할 수 있습니까?
ypercubeᵀᴹ

1

char (15) 또는 15 tinyint를 사용하여 tiny int (0 ~ 255)를 사용하는 한 동일합니다 (크기가 현명합니다). 따라서 성능 관점에서 추출 및 문자열 처리를 절약하므로 15 개의 tinyint를 사용하십시오.

최신 정보

표시가 두 자리 숫자 인 경우 CHAR (30)이 필요하며 이는 tinyint의 15 배 크기의 두 배입니다.


9
이 매우 단순한 디자인을 감안할 때,이 지구상에 현대 RDBMS에서 성능 문제를 일으킬 수있는 15 개의 시험 (마크가있는)을 충분히 보유하고있는 기관이 있다면, 오늘 밤 잠을 자게 될 것입니다.
Philᵀᴹ

1
마크가 두 자리 숫자라면? 그러나 작은 int는 계산하는 방법에 따라 0에서 255까지의 점수 또는 -127에서 127까지의 점수를 다룹니다. 따라서 점수가 거의 마이너스가되지 않기 때문에 한 번의 시험에 250 점 이상이 부여되며 대부분의 시험은 0-100 % 척도에서 점수가 매겨집니다. 나는 tinyint가 여기에서 절대적으로 유용하다고 생각합니다.
jcolebrand

예, 동의합니다. 두 자리 표시를 한 자리 표시와 다르게 사용하면 문자로 저장하는 것이 훨씬 더 나빠진다는 데 동의했습니다. 이후 char (15) 대신 char (30)이 필요합니다. 두 자리 수인지 아닌지에 관계없이 15 개의 작은 정수는 항상 15 바이트입니다.
Edward Dortland

-1이 답변은 다른 게시물에서 제안한대로 각 시험 결과를 자체 행에 저장하는 것
보다 열별
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.