2008-09-29 9 views
1

저는 현재 자바에서 학교 프로젝트를 진행 중이며 데이터베이스 응용 프로그램을 코딩하고 있습니다. 쿼리를 입력하고 결과를 얻을 수있는 MySQL 모니터와 같은 것입니다.데이터베이스 데이터를 파일에 저장 하시겠습니까?

이전에 코딩 한 응용 프로그램에서는 데이터베이스를 사용하여 사용자 프로필, 설정 등의 데이터를 저장했습니다. 지금 당연히이 학교 프로젝트에서 생성 된 데이터를 데이터베이스에 저장할 수는 없습니다. 포인트?

데이터를 파일에 저장하는 것에 대해 생각하고 있습니다.하지만 지금 생각할 수있는 유일한 생각입니다. 나는 약간 건조한 상태입니다. 솔직히 말하면, 코드를 두드리기 시작하고 싶지는 않습니다. 그리고 나서 나는 그것을하는 더 좋은 방법을 발견합니다.

누군가 CSV 같은 데이터를 저장하는 방법을 알고 있거나 데이터베이스 응용 프로그램이 내부적으로 어떻게 작동하는지 알면 어떤 빛을 비추어 줄 수 있습니까?

- EDIT : 더 명확하게하기 위해 데이터베이스 엔진을 사용하여 데이터를 저장할 수 없으므로이 방법으로 넣으면 간단한 데이터베이스 엔진을 코딩합니다. Galwegian, jkramer 및 Joe Skora가 제안한 것과 같은 아이디어가 내가 원하는 것입니다.

+0

여기에 숙제 태그를 붙여야합니다. –

답변

1

xml 파일을 사용하여 '데이터베이스'응용 프로그램의 원리에 대한 간단한 증명을하고 아마도 xpath를 사용하여 쿼리 할 수 ​​있다고 가정합니다.

(파일 크기 및 하드웨어에 따라) 데이터베이스에 비해 속도가 매우 느릴 수 있지만 효과가 있습니다.

0

C#을 사용하는 경우 간단한 linq를 xml 유형 ORM으로 작성하는 것이 좋습니다.

0

YAML과 같은 직렬화 형식을 사용하고 해시 배열을 저장할 수 있습니다. 각 해시는 테이블 레코드이고 각 해시의 키는 열 이름입니다. 그런 다음 직렬화 된 파일을 메모리에로드하고 배열 및 해시 작업을 수행 한 다음 모든 내용을 다시 저장할 수 있습니다.

나는 그것이 당신이 의미하는 바램입니다.

2

아마도 사용하고자하는 것은 random access files입니다. 레코드에 대한 필드 세트가 있으면 디스크로 블록으로 쓸 수 있습니다. 인덱스를 메모리에 디스크에 별도로 보관하고 언제든지 직접 모든 레코드에 액세스 할 수 있습니다. 바라기를하면 시작하기에 충분합니다.

2

귀하의 요구 사항을 잘 모르겠지만 'SQLite'을 사용할 수는 없습니다. (여전히 데이터베이스 엔진이지만 처음에는 피할 수있는 것이므로 확실하지 않습니다.)?

0

사용자 설정 등을 저장하기 위해 hsqldb과 같은 파일 기반 데이터베이스를 사용할 수 없습니까? 이 방법을 사용하면 데이터에 친숙한 인터페이스가있어서 파일 시스템에 저장할 수 있습니다.

5

물론 실제 데이터베이스가 구현되는 방식이므로 파일 시스템을 사용하여 데이터베이스를 직접 만들 수 있습니다. 예를 들어 고정 또는 가변 길이 원시 데이터 파일에 데이터를 저장 한 다음 저장하려는 인덱스 정보의 유형에 따라 모든 쿼리에 대한 빠른 인덱싱 된 액세스를 위해 다른 파일에 파일 포인터가있는 별도의 인덱스 파일을 만들 수 있습니다 인덱스 파일에

그래서 예, 데이터를 저장하는 데 1 개를 사용하고 다른 하나는 빠른 인덱스 액세스를 제공하려는 인덱스가 입력 한 파일에 파일 포인터를 저장하는 두 개의 파일을 만듭니다.

행운을 빈다 - 나는 내기하고있는이 프로젝트로 데이터베이스 구축에 대해 많은 것을 알게 될 것이다.

+0

Oooh, XML/XPath를 사용하는 간단한 데이터베이스에 관한 Galwegians 아이디어가 마음에 들지만 운동의 요점이 자신의 "인덱싱"시스템을 만드는 것이 아니라면 좋은 출발점이 될 것이라고 생각합니다. –

+0

당신의 생각은 너무 좋습니다. 나는 당신이 말하는 것에 대해 전혀 경험이 없기 때문에 제가 광장에서 시작해야한다는 것을 제외하고는! :) 아이디어 친구를 보내 주셔서 감사합니다;) –

0

StackOverflow는 숙제가 아닙니다.

효율적이고 유연한 데이터베이스를 만드는 빠르고 쉬운 방법이 있습니다.

  1. 원하는 것을 수행하는 멋진지도 (HashMap, TreeMap, 무엇이든)를 디자인하십시오. 종종 데이터가있는 "레코드"클래스와 컬렉션 인 Map<String,List<Record>> 인 "인덱스"개체가 있습니다. (왜 레코드 목록인가? 선택하지 않는 필드의 인덱스는 무엇입니까?)

  2. 콜렉션을 파일로 직렬화하는 클래스를 작성하십시오.

  3. 파일을 사용하여 컬렉션을 deserialize 할 클래스를 작성하십시오.

  4. 메모리 내 Java 객체를 둘러싼 쿼리 처리 등을 작성하십시오.

메모리 내장 데이터베이스.

Java의 직렬화가 좋지 않습니까? JSON 또는 YAML 라이브러리를 가져 와서 이러한 형식을 사용하여 직렬화 및 비 직렬화하십시오.

"그러나 메모리 내 데이터베이스는 확장되지 않습니다."라고 순정 주의자들은 소리 쳐요. SQLite로 가져 가라. 내 PC는 2GB의 RAM을 가지고 있으며 꽤 큰 데이터베이스입니다. SQLite가 작동합니다.

+0

답장을 보내 주셔서 감사합니다. 답장을 보내 주시면 아무에게도 숙제를 요청하지 않습니다. 나는 지금보다 나은 코더의 아이디어를 얻으려고 여기있다. –

+0

@ninuhadida : "저는 현재 학교 프로젝트를 진행하고 있습니다."어떻게 숙제가 아닌가요? –

+0

나는 불꽃 전쟁을 여기서 시작하고 싶지 않지만, : 1. 나는 단지 아이디어를 요구하고있다. 2. 학교에서 우리는 기초 만 배웠다. 3. 우리는 우리가 원하는 프로젝트 타이틀을 자유롭게 고를 수있다. 4. 나는 그것을 어려운 길로 만들고 실제로 뭔가를 배우기로 결정했습니다. StackOverflow는 "학습"할 수있는 방법입니다. –

2

테이블 당 하나의 파일 인 이진 테이블을 사용하는 데이터베이스를 만들 것입니다. 매우 편리한 DataInputStream 및 DataOutputStream 클래스를 살펴보십시오. 이들을 사용하면 바이너리 파일에서 Java 유형으로 쉽게 이동할 수 있습니다.

테이블의 간단한 구조를 정의 할 것입니다. 테이블의 내용을 설명하는 헤더와 그 뒤에 행 데이터가 나와 있습니다. 테이블의 각 열을 헤더에 정의합니다 (이름, 데이터 유형 및 최대 길이). 단순하게 유지하십시오. DataInput/OutputStream의 기능을 사용하여 몇 가지 데이터 유형 만 처리하십시오. 간단한 파일 이름 지정 규칙을 사용하여 테이블 이름을 파일 이름과 연관 시키십시오.

각 데이터 유형 중 적어도 하나를 가질만큼 충분한 열이있는 테스트 테이블을 작성하십시오. 그런 다음 입력 파일을 처리하거나 콘솔 입력을 통해 데이터로 테이블을 채우는 간단한 방법을 작성하십시오. 마지막으로 전체 테이블의 내용을 콘솔에 표시하는 간단한 방법을 만듭니다.

그런 다음 SQL과 유사한 방언의 매우 간단한 버전을 추가하여 쿼리를 수행 할 수 있습니다. 이 같은 간단한 쿼리 :

SELECT * FROM EMPLOYEES 

는 ... 내용을 반환 헤더를 구문 분석, 전체 테이블을 통해 읽기, (테이블의 파일 이름 명명 규칙을 통해) EMPLOYEES 테이블을 포함하는 파일을 개방을 요구한다.

작업을 마치면 간단한 WHERE 절 처리와 같은 특정 기능을 추가하여 특정 조건과 일치하는 행 (또는 행 내의 열) 만 반환하는 것이 간단 해집니다.

이 같은 범용 솔루션 (테이블의 수, 컬럼의 수, 실제 쿼리 언어 등) 당신은 단순히처럼 API에 메소드를 추가 할 수 있습니다 가지고을 필요는 없습니다 경우

Employee[] result = EmployeeDataManager.select("LASTNAME", "Smith"); 

... 또는 이와 비슷한 것입니다. 내가 제안한 것처럼 몇 가지 작은 작업으로 기능을 나눠서 천천히 구축한다면 조만간 필요한 모든 기능을 구현하게 될 것입니다.

+0

데이터 입출력 스트림을 살펴 보겠습니다! 적어도 말하기를 약속 한 것 같습니다. 감사합니다. –

1

데이터 파일의 블록에 레코드를 저장하는 기본 사항은 수십 년 전부터 있습니다. 당연히 테마에는 많은 변형이 있으며, 모두 느린 디스크 드라이브가 있다는 사실을 해결하기 위해 설계되었습니다.

하지만 기본 사항은 어렵지 않습니다. 고정 길이 열과 고정 열 수를 결합하면 데이터베이스의 모든 레코드에 매우 신속하게 액세스 할 수 있습니다.

거기에서 모든 오프셋입니다.

10 개의 32 비트 정수를 포함하는 간단한 행의 예를 들어 보겠습니다. 단일 행은 40 바이트 (정수 * 4 당 4 바이트)입니다. 123 행을 원하면 40을 곱하면됩니다. 123 * 40은 4920의 오프셋을줍니다. 데이터베이스 파일까지 40 바이트를 읽으십시오. 데이터베이스에서 행이 있습니다.

인덱스는 B + 트리에 저장되며 트리 노드는 디스크의 여러 블록에 분산됩니다. B + Tree의 강력한 기능은 트리 내에서 단일 키 값을 쉽게 찾을 수 있다는 것입니다. 그런 다음 리프 노드를 걷고 키 순서대로 데이터를 스크롤하면됩니다.

유용하고 인기있는 간단한 형식의 경우 원래 DBase 형식 인 DBF 파일을 찾는 것이 좋습니다. 몇 년 동안 진화 해 왔지만 기초는 매우 간단하고 문서화가 잘되어 있으며 많은 작업이 가능합니다. 문제의 근본적인 문제를 모두 다루는 완벽하게 실행 가능한 데이터베이스 형식입니다.

관련 문제