2010-07-06 4 views
3

지금까지 우리 회사는 데이터베이스에 대한 혐오감을 갖고 있으며 모든 데이터를 쉼표로 구분 된 파일로 저장하는 데 어려움을 겪고 있습니다. 필자는 관계형 데이터베이스의 사용으로 이익을 얻을 수있는 고유 한 고객 응용 프로그램을 실행했습니다. 이 응용 프로그램은 제조 프로세스 및 여러 하위 프로세스의 '자세한'데이터와 관련된 '요약'데이터를 저장해야합니다. 하위 프로세스는 프로세스 요약에 링크되어야합니다.코드에 존재하지 않는 데이터베이스 테이블 만들기

내 질문 :이 테이블에 쓰기 전에 테이블이 존재하는지 확인하고 테이블이 존재하지 않는 경우 테이블을 생성하는 것이 정상입니까/적절합니까? 이것은 이제 내가 이것을 타이핑하는 큰 질문으로 이어질 수있다. 데이터베이스가 존재하지 않는다면 데이터베이스와 필요한 모든 테이블을 생성해야합니까?

+2

'내 회사는 데이터베이스에 대한 혐오감을 갖고 있으며 모든 데이터를 쉼표로 구분 된 파일'OMG, 공포로 저장하는 데 전념했습니다. – Pete

+0

어떤 경우에는 공포라고 생각합니다. 플랫 파일을 쉽고 빠르게 읽고 쓸 수 있다는 장점이 있지만 관계형 데이터를 다루는 방법은 없습니다. 아무도 그것을 개발하기가 힘들었 기 때문입니다. – Ryan

답변

3

으로 SQLite는 테이블을 직접 만드는 것이 좋은 방법입니다. 고객의 설치 지침을 기존보다 더 복잡하게 만들 필요가 없으며, 데이터베이스가 응용 프로그램의 내부에 완전히 포함되어있는 경우, 사용자가 자신의 응용 프로그램에 대해 어떤 형식이든 상관하지 않을 것입니다. 소프트웨어는 신뢰할 수 있고 빠릅니다.

예를 들어 파이어 폭스는 최근에 내부 저장소로 SQLite를 사용하며 사용자가 데이터베이스를 만들지 않아도됩니다. 그리고 사용자는 그런 식으로. :)

그러나 테이블을 참조하기 직전에 데이터베이스를 작성하는 것에 대해 너무 걱정하지 않아도됩니다. 대신 응용 프로그램 시작 또는 설치시 작성 논리를 배치하는 것이 더 적절합니다.이제 응용 프로그램에서 생성 된 CSV 파일은 어디에 있습니까? 그들이 새로 참조 된 매번 새로 만들어 졌습니까? 또는 초기화 또는 설치 루틴에서도 생성됩니까?

+0

CSV 파일은 중첩 된 디렉토리 구조 전체에 분산되어 있으며 응용 프로그램 시작시 만들어집니다. 시작시 생성은이 애플리케이션에서 완벽하게 이해됩니다. – Ryan

1

SubSonic SimpleRepository 일반적으로 이러한 유형의 상황을 처리합니다 (외래 키 관계 제외).

일반적으로 나는 당신의 얼굴에 날아 가기 쉽기 때문에 코드를 통해 데이터베이스 및/또는 테이블을 만들고 관리하지 않는 경향이 있습니다.

1

정확히이 유형의 컨텍스트에 대해 Sqlite는 "존재하지 않는 경우 테이블 만들기"구문을 사용합니다. (http://www.sqlite.org/lang_createtable.html 확인) 대부분의 라이브러리에는 연결시 새 sqlite 데이터베이스 파일을 만들 수있는 옵션이 있습니다 (아직없는 경우).

2

일반적으로 테이블의 존재하지 않는 것은 어딘가에 문제가 있음을 나타냅니다. 동적으로 생성 된 테이블은 일반적으로 잘못된 것의 표시이며 표준 테이블 (예 : tblUsers) 인 경우 설정 프로세스의 일부로 항상 설정되어 있어야합니다.

필자는 실존을 확인하는 것이 합리적이라고 생각할 수 있습니다. 일단 코드 개발에서 특정 거리를 확보하고 추가 테이블을 추가하기 위해 데이터베이스를 업그레이드하지만이 새로운 디자인과 기존 코드로 작업하도록 코드를 원한다면 . 이 경우 테이블을 사용하기 전에 테이블 존재 여부를 확인하는 것이 합리적입니다.

일반적으로 데이터베이스에있는 테이블을 알아야하며 테이블의 존재 여부를 확인할 필요가 없습니다. 그리고 나는 왜 당신이 존재하지 않는 데이터베이스에 접근하려고하는지에 관해서 완전히 잃어 버렸습니다 ... 당신은 새로운 클라이언트 (또는 비슷한)가 즉시 추가 될 수있는 어떤 종류의 게으른 셋업 프로세스에 대해 생각하고 있습니까? 데이터베이스가 생성 되었습니까? 그렇다면 새로운 데이터베이스를 만들고 설정하는 단일 프로세스가 필요합니다.

3

아니요, 코드에서 테이블을 만드는 것이 정상적이지 않습니다. 관계형 데이터베이스가 필요하면 사용하기 전에 디자인해야합니다. 관계형 데이터베이스는 쓸모 없어야합니다. 당신은 전에 이런 짓을 한 적이 없다면, 여기에 주제에 대한 소개입니다

...

http://www.databasedev.co.uk/design_basics.html가 (당신이 알고 있다면 죄송이 모든 것이, 내가 선심 의미하지 않는다.)

+0

사용하기 전에 데이터베이스를 디자인하는 것이 일반적입니다. 그러나 데스크톱 응용 프로그램의 경우 파일 기반 데이터베이스를 사용하면 코드를 통해 데이터베이스를 만드는 것이 적절할 수 있습니다. 많은 응용 프로그램이 하나의 서버 데이터베이스를 공유하는 엔터프라이즈 환경에서는 다릅니다. – MarkJ

+0

설치하는 것을 의미합니까? Ryan은 응용 프로그램이 실행되는 동안 의미가 있다고 생각했습니다. 정말 정상인가요? 데이터베이스 정의 도구를 제외하고 말입니다. 또는 여기에 막대기의 잘못된 끝을 잡았습니까? –

+1

사실이 아닙니다. 상업용 응용 프로그램은 특정 상황에서 테이블 및 전체 데이터베이스를 작성합니다. 다양한 고객 제공 데이터베이스 서버에 대해 실행되는 응용 프로그램은 일반적으로 설치 프로세스의 일부로 전체 데이터베이스를 작성합니다. 새 버전으로 릴리스 된 응용 프로그램은 일반적으로 각 릴리스마다 데이터베이스를 업그레이드합니다 (테이블 추가 포함). –

0

관계형 데이터베이스를 사용하면 데이터를 쉽게 공유 할 수 있습니다.

데이터를 공유 할 필요가없는 경우 파일을 사용할 수 있습니다.

DataSet serialization은 파일에 정보를 저장하는 데 좋은 옵션입니다. 관계형 데이터베이스처럼 구조화 된 데이터를 유지 관리합니다.

XML을 직렬화 속도가 느립니다하지만 당신은으로 된 BinaryFormatter를 사용할 수 있습니다

RemotingFormat = SerializationFormat.Binary 

이 옵션은 빠르고 컴팩트 한 바이너리 직렬화한다.

코드 프로젝트에는 "Fast Serialization"기사가 포함되어 있습니다. 그러나 이것은 표준이 아닙니다.

1

응용 프로그램을 작성하기 전에 데이터 구조를 알아야합니다.

가능하면 데이터와 응용 프로그램을 분리하십시오.

데이터 액세스 레이어를 사용하면 이미 Windows 응용 프로그램이 있고 웹 프런트 엔드를 만들고 싶다면 DAL을 쉽게 다시 사용할 수 있습니다.

데이터 액세스가 응용 프로그램 내에 내장 된 경우 해당 코드를 다시 사용하는 것이 훨씬 어렵습니다.

+0

... 또한 데이터베이스 스키마 생성이 애플리케이션 내에 내장 된 경우 ... 떨림! – onedaywhen

0

답변은 프로젝트의 성격에 따라 다릅니다.

단일 인스턴스가있는 사내 시스템 인 경우 소프트웨어를 업데이트 할 때 개발 시간을 절약하고 수동으로 데이터베이스를 새 테이블로 업데이트하는 것이 좋습니다. 이 경우 소프트웨어가 테이블을 추가하는 것에 대해 걱정할 필요가 없습니다.

이 소프트웨어를 고객 또는 조직 내의 원격 사이트에 제공하고 설치 및 업그레이드가 "현장에서"발생하면 소프트웨어의 각 새 버전이 데이터베이스를 자체적으로 업그레이드해야합니다. 각 SQL 명령 전에 반드시 확인해야 할 필요는 없으며 반드시 소프트웨어를 실행할 때마다 확인하지 않아도됩니다. 데이터베이스의 어딘가에 "데이터 구조 버전 번호"를 저장하고 시작시 해당 번호를 확인하고 현재 릴리스 아래의 숫자 인 경우 구조적 업데이트 만 적용 할 수 있습니다.

0

많은 RDBMS가 DDL SQL 문을 지원합니다. ADOX는 일부 데이터베이스에서 새 테이블을 만드는 작업을 수행하는 데 사용할 수 있습니다. 필자는 특히 프로그램이 내부 데이터 저장소 또는 출력 형식으로 "임베디드"파일 기반 데이터베이스를 사용하는 경우 특히 이색 적이라고 생각하지 않습니다.

필요에 따라 색인, 제약 조건, 관계 등을 만드는 데 문제가 없습니다. 예 :

Private Const WG_CONNSTRING As String = _ 
     "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5;" _ 
    & "Jet OLEDB:Create System Database=True;" _ 
    & "Data Source='$MDB$.mdw'" 
Private Const DB_CONNSTRING As String = _ 
     "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5;" _ 
    & "Jet OLEDB:System Database='$MDB$.mdw';" _ 
    & "Data Source='$MDB$.mdb'" 

'Exits with new MDB created, populated from initial data 
'in text files, and cnDB left open. 

Dim catDB As Object 'Don't early-bind ADOX objects. 

Set catDB = CreateObject("ADOX.Catalog") 
catDB.Create Replace$(WG_CONNSTRING, "$MDB$", MDB_NAME) 
catDB.Create Replace$(DB_CONNSTRING, "$MDB$", MDB_NAME) 

Set cnDB = catDB.ActiveConnection 
With cnDB 
    .Execute "CREATE TABLE Fruits (" _ 
      & "FruitID IDENTITY NOT NULL CONSTRAINT PK_FruitID PRIMARY KEY," _ 
      & "Fruit TEXT(50) WITH COMPRESSION NOT NULL UNIQUE" _ 
      & ")", _ 
      , adCmdText 
    .Execute "CREATE TABLE Pies (" _ 
      & "PieID IDENTITY NOT NULL CONSTRAINT PK_PieID PRIMARY KEY," _ 
      & "Pie TEXT(50) WITH COMPRESSION NOT NULL," _ 
      & "FruitID INTEGER NOT NULL CONSTRAINT FK_FruitID " _ 
      & "REFERENCES Fruits (FruitID)" _ 
      & ")", _ 
      , adCmdText 
    .Execute "CREATE VIEW PiesView (ID, Pie, Fruit) AS " _ 
      & "SELECT PieID AS ID, Pie, Fruit " _ 
      & "FROM Pies LEFT OUTER JOIN Fruits " _ 
      & "ON Pies.FruitID = Fruits.FruitID", _ 
      , adCmdText 
    .Execute "CREATE PROC InsertPie(NewPie TEXT(50), FruitName TEXT(50)) AS " _ 
      & "INSERT INTO Pies (Pie, FruitId) " _ 
      & "SELECT NewPie, Fruits.FruitId FROM Fruits " _ 
      & "WHERE Fruit = FruitName", _ 
      , adCmdText 
End With 
관련 문제