2011-04-21 2 views
1

나는 이미 What would be a good approch for using XML as data persistence for a small C# app?에 대한 일반적인 지침을 다뤘습니다.XML 유지 : 여러 파일 또는 단일 파일?

XML을 사용하기로 결정했습니다. 그것은 작은 응용 프로그램, 교사 사용을위한 성적표 응용 프로그램입니다. 다음은 내 주요 엔티티 :

  • 학생
  • 코스
  • 교사 (이 하나 있어야한다,하지만 난 때문에 미래의 통합 가능성을 저장할 수 있습니다) 학생이 더있을 수 있습니다 (
  • 학년 각 코스에서 한 등급)

보다 내가 몇 가지 포인트를 가지고 싶습니다 제안 :

  • 엔티티 당 하나의 XML 파일이나 하나의 큰 XML 파일을 사용해야합니까?
    • 방법, 성능 측면에서
    • 방법 배후에있는 데이터에 가입 관점
  • 아래에 있다는 있다는이야 내가 LINQ to XML을 사용해야합니까? 고려해야 할 다른 것이 있습니까?
+0

웹 앱이 아닌 데스크탑이라고 가정합니다. – LarsH

+0

예, 그렇습니다. 지금은 오프라인 독립 실행 형입니다. 진화 할지도 모릅니다. 시간이 말해 줄 것입니다. 그래서 나는 결정했다. 가능한 한 간단해야한다. 심지어 임베디드 DB도 사용하지 않습니다. 파일을 생성해야합니다. XML은 사람이 기계로 읽을 수 있고 쓸 수 있습니다. 그래서 그것은 분명한 선택입니다. 파일은 그다지 크지 않아야합니다. 한 선생님은 100 명의 학생 탑을가집니다. 한 교사는 약 3에서 6 과목을 가르칩니다. 나는 심지어 모바일에 그것을 구축하는 것을 생각하고있다.Linq이 내 인생을 더 쉽게 만들어주기 때문에 C#을 고수하고 싶습니다. 나는 단지 하나의 x 다중 파일 딜레마에 대해 궁금해하고있다. 무엇을 고려해야합니까? 나는 무엇을 고려하고 있지 않습니까? –

+0

고통을 고집하는 경우 다른 옵션은 "이전"DataTable/DataSet을 사용하여 자동으로 일련 화되도록하는 것입니다. (나는 SQLite 또는 관계 성/DQL이 좋습니다!) XML은 손으로 편집해야하거나 교환 형식 (예 : 다른 곳에서 사용됨)으로 사용되지 않는 한 많이 "구매"하지 않습니다. 사실 XPath로 형식화되지 않은 데이터 객체 인 XML을 사용하는 것이 XML의 또 다른 좋은 점입니다. 그러나 누군가 나를 위해 그것을 찔러 넣을 것이라고 생각합니다. –

답변

2

하나의 XML 파일이 더 쉽습니다.

파일은 다음과 같이 하심 :

<ReportCardData> 
    <Students> 
     <Student>...data for student A ...</Student> 
      ... 
    </Students> 
    <Teachers> 
     <Teacher> ... 
     ... 
    </Teachers> 
    <Courses> 
     <Course> ... 
      ... 
    </Courses> 
</ReportCardData> 

C#의 코드는 다음과 같을 것이다 :

public class ReportCardData 
{ 
    public List<Student> Students; 
    public List<Teacher> Teachers; 
    public List<Course> Courses; 
} 

및 역 직렬화하기 (읽기를) 데이터를 다음과 같습니다 코드 :

ReportCardData rcd = null; 
var s= new System.Xml.Serialization.XmlSerializer(typeof(ReportCardData>)); 
using(System.IO.StreamReader reader= System.IO.File.OpenText(filepath)) 
{ 
    rcd= (ReportCardData) s.Deserialize(reader); 
} 

... 등,

적절한 예외 처리에 추가해야합니다

XML 직렬화를 사용하면 수십 메가 바이트의 대용량 데이터 세트의 경우에도 이와 같이 작동합니다. (100 메가 바이트의 데이터를 말하는 경우 SQL Express와 같은 실제 데이터베이스를 고려해보십시오.

읽기 및 쓰기 성능이 좋을 것입니다. XML 파일에서 데이터를 비 직렬화하면 전체 데이터 세트가 앱의 메모리에 보관됩니다. 따라서 15MB의 학년 데이터라면 한 번에 모두 메모리에 저장됩니다.

"데이터 결합 관점"에 대해서도 물어 보았습니다. 그 의미는 모르지만 Linq를 XML로 사용하면 해당 데이터에서 쿼리를 수행 할 수 있습니다. 메모리 내 쿼리의 성능도 좋습니다.

+0

당신이 어디를 가는지 봅니다. 그래서, 파일이로드 될 때 메모리에 4 세트를로드 할 수 있습니다 (말하자면, 4리스트 ). 사용자는 그 다음에 놀 수 있습니다. 사용자가 저장을 클릭하면 모든 것이 XML에 저장됩니다. 이것은 하나의 시나리오입니다. 다른 하나는 각 상호 작용시 저장됩니다 (예 : 모바일 앱인 경우). 첫 번째 접근 방식에 대해 어떻게 생각합니까? 두 번째로 성능 문제를 최소화하려면 어떻게해야합니까? 최적으로 XML 파일의 일부만 저장할 수 있습니까? –

+0

+1 ... 또는 SQLite와 같은 "실제"데이터베이스 –

+0

첫 번째 방법을 권합니다. 모든 것을로드하고 한 번에 모두 저장하십시오. 네 개의 목록은 하나의 클래스의 일부가 될 것입니다. 하나의 중첩 된 객체가 직렬화되고 직렬화 해제됩니다. 진실로 성과에 관심이 있다면 조금 바뀔 수 있습니다. 모바일 앱에서 XML 데이터베이스가 매우 크기 때문에 메모리에 보관하고 싶지 않았습니다. XML 파일을 읽고 색인화하도록 설계했습니다. 사용자가 드릴 다운을 원하거나 업데이트 할 때 XML 파일에서 인덱싱 된 위치를 찾고 큰 XML 파일의 세그먼트 (일부 자식 요소 만)를 읽음 + 업데이트합니다. – Cheeso

관련 문제