복붙노트

[SQL] 데이터베이스 테이블의 컬럼의 목록을 저장하는 방법

SQL

데이터베이스 테이블의 컬럼의 목록을 저장하는 방법

그래서, 관련 질문에 대한 메흐 다드의 대답에 따라, 나는 "적절한"데이터베이스 테이블의 열 목록을 저장하지 않습니다 그것을 얻을. 오히려, 당신은 효과적으로 직접 또는 접합 테이블을 통해 그것을 상기 목록의 요소와 다음 링크를 보유하고 다른 테이블을 만들어야합니다. 그러나, 나는 만들려는 목록의 유형 (링크 된 질문의 과일 예와는 달리) 고유 항목으로 구성됩니다. 내가 다른 테이블의 요소를 저장하면, 나는 그들에게 내가 그들을 액세스 할 때마다 분류 할 거라고하는 방법 - 또한, 내 목록의 항목을 명시 적으로 분류되어 있습니다. 마지막으로, 목록은 내가 목록에 액세스하고자하는 시간, 나는 그것의 단지 부분보다는 전체 목록을 액세스 할 것이라고에서 기본적으로 원자 - 조각을 함께 수집하는 데이터베이스 쿼리를 실행해야 할 바보 같다, 그래서 목록.

(위의 링크)의 용액 AKX리스트를 직렬화 및 이진 컬럼에 저장하는 것이다. 그것이 내가 직렬화 및 역 직렬화에 대해 걱정할 필요가 있음을 의미하기 때문에 그러나이 또한 불편을 보인다.

어떤 더 나은 솔루션이 있습니까? 경우 더 나은 솔루션은 이유 없다? 이 문제가 수시로 마련한다 보인다.

나는에서오고 어디 ... 조금 더 정보를 알려합니다. 난 그냥 이해 SQL 및 일반적으로 데이터베이스를 시작했다 곧, 나는 SQL에 LINQ에 켜져 있었다, 나는 물체 방법에 대해 생각하지 않고 내 프로그래밍 개체 모델을 처리 할 것으로 예상하기 때문에 그래서 지금은 조금 버릇있어 쿼리 또는 데이터베이스에 저장됩니다.

감사합니다 모든!

남자

업데이트 : 그래서 내가 갖는 응답의 첫 번째 날리고에서, 나는 "당신이 CSV / XML 경로를 갈 수 있습니다 ...하지만하지 마!"를 참조하십시오. 그래서 지금 나는 이유에 대한 설명을 찾고 있어요. 좋은 참조에 저를 가리 킵니다.

또한, 당신에게 내가까지 해요 것들에 대한 아이디어도 제공 : 내 데이터베이스에서 나는 (X, Y) 쌍의 목록을하는 함수 테이블을 가지고있다. (이 표는 우리의 논의없이 결과의 기타 정보를 제공합니다.) 나는 (X, Y) 쌍 목록의 일부를 볼 필요하지 않습니다. 오히려, 나는 그들 모두를 가지고 화면을 그릴 것입니다. 나는 사용자가 때때로 값을 변경하거나 플롯에 더 많은 값을 추가하는 주변의 노드를 드래그 할 수 있습니다.

해결법

  1. ==============================

    1.아니, 단일 열에서 항목의 순서를 저장 할 "더 나은"방법이 없다. 관계형 데이터베이스 구체적 행 / 열 조합 당 하나 개의 값을 저장하도록 설계된다. 하나 개 이상의 값을 저장하려면, 당신은 다음, 저장을위한 하나의 값으로 목록을 직렬화한다 검색에 직렬화. (당신이에 대해 얘기하는 것은 일반적으로 수행되어서는 안 좋은 생각 때문에) 당신이 무슨 말을하는지 할 수있는 다른 방법이 없습니다.

    아니, 단일 열에서 항목의 순서를 저장 할 "더 나은"방법이 없다. 관계형 데이터베이스 구체적 행 / 열 조합 당 하나 개의 값을 저장하도록 설계된다. 하나 개 이상의 값을 저장하려면, 당신은 다음, 저장을위한 하나의 값으로 목록을 직렬화한다 검색에 직렬화. (당신이에 대해 얘기하는 것은 일반적으로 수행되어서는 안 좋은 생각 때문에) 당신이 무슨 말을하는지 할 수있는 다른 방법이 없습니다.

    난 당신이 그 목록을 저장하는 또 다른 테이블을 만드는 어리석은 생각을 이해하지만,이 관계형 데이터베이스가 똑같이 것입니다. 당신은 힘겨운 싸움을하고 더 좋은 이유에 대한 관계형 데이터베이스 설계의 가장 기본적인 원칙 중 하나를 위반하고 있습니다. 당신은 단지 SQL을 배우고 당신이 상태 때문에, 난 강력하게 더 맛 SQL 개발자가 당신에게 권장하는 관행이 아이디어 및 스틱을 피하기 위해 조언을 것입니다.

    당신이 위반하는 원리는 데이터베이스 정규화의 첫 번째 단계입니다 제 1 정규형을 호출됩니다.

    일을 지나치게 단순화의 위험에서, 데이터베이스 정규화 당신이 그것에 대하여 합리적인 일관성 쿼리를 작성하고 쉽게 유지할 수 있습니다 그래서, 데이터가 무엇인지에 따라 데이터베이스를 정의하는 과정이다. 정규화는 데이터의 논리적 일관성과 부패를 제한 할 수 있도록 설계하고, 그것에 수준의 많이있다있다. 데이터베이스 정규화에 대한 위키 백과 문서가 꽤 좋다.

    기본적으로, 정상화의 첫 번째 규칙 (또는 형태) 테이블이 관계를 표현해야한다는. 이 의미 :

    마지막 점은 분명히 여기 두드러진 점이다. 당신이 세트 자신을 저장하는 SQL은 "버킷"을 제공하지, 당신을 위해 세트를 저장하도록 설계되었습니다. 예, 할 수 있습니다. 아니, 세상이 끝나지 않을 것입니다. 당신은, 그러나, 이미 SQL과 즉시 ORM을 사용으로 점프하여 함께 갈 모범 사례를 이해하는 자신을 불구있다. SQL에 LINQ는 그래프 계산기이처럼 환상적이다. 같은 맥락에서, 그러나, 그들은 프로세스가 실제로 작업을 사용하는 방법을 알고 대용으로 사용할 수 없습니다.

    귀하의 목록은 이제 완전히 "원자"할 수있다, 그것은이 프로젝트 변경할 수 없습니다. 하지만 당신은, 그러나, 다른 프로젝트에서 유사한 일을하는 습관을 얻을 것이다, 당신은 결국 (가능성이 빨리) 당신은 지금 당신의 빠르고 쉬운 N-리스트에-A-열을 피팅하고 시나리오로 실행하겠습니다 그것은 전적으로 부적절 곳 접근. 이 당신이 가게에 무슨 말을 하려는지에 대한 올바른 테이블을 만드는 많은 추가 작업은하지 않고, 그들은 당신의 데이터베이스 디자인을 볼 때 다른 SQL 개발자에 의해 조롱되지 않습니다. 게다가, SQL에 LINQ는 관계를 볼 것입니다 자동으로 목록에 당신에게 적절한 객체 지향 인터페이스를 제공합니다. 왜 당신은 당신이 비표준하고 경솔한 데이터베이스 해커를 수행 할 수 있도록 ORM에 의해 당신에게 제공하는 편리함을 포기?

  2. ==============================

    2.당신은 SQL을 모두 함께 잊지하고 "NoSQL에"접근 방식으로 갈 수 있습니다. RavenDB는 MongoDB를하고 CouchDB를 점프가 가능한 솔루션으로 마음입니다. 되는 NoSQL 접근 방식, 당신도 스키마에 구속되지 않는 관계 model..you을 사용하고 있지 않습니다.

    당신은 SQL을 모두 함께 잊지하고 "NoSQL에"접근 방식으로 갈 수 있습니다. RavenDB는 MongoDB를하고 CouchDB를 점프가 가능한 솔루션으로 마음입니다. 되는 NoSQL 접근 방식, 당신도 스키마에 구속되지 않는 관계 model..you을 사용하고 있지 않습니다.

  3. ==============================

    3.내가 많은 사람들이 할 본 것은이 (만약 내가 잘못, 날 수정이 최선의 방법하지 않을 수 있습니다)입니다 :

    내가 많은 사람들이 할 본 것은이 (만약 내가 잘못, 날 수정이 최선의 방법하지 않을 수 있습니다)입니다 :

    내가 예에서 사용하고 테이블은 (. 표는 특정 여자 친구에게 주어진 것을 별명을 포함 각 여자 친구 고유 ID가 있습니다) 아래에 주어진다 :

    nicknames(id,seq_no,names)
    

    당신이 ID로 많은 별명을 저장할 가정하자. 이것은 우리가 seq_no 필드를 포함 이유입니다.

    지금, 당신의 테이블에이 값을 입력 :

    (1,1,'sweetheart'), (1,2,'pumpkin'), (2,1,'cutie'), (2,2,'cherry pie')
    

    당신이 당신의 여자 친구 ID를 1로 준 것으로 모든 이름을 찾으려면 당신은 사용할 수 있습니다 :

    select names from nicknames where id = 1;
    
  4. ==============================

    4.다른 사람들이 말씀하신 것을 외에도, 나는 당신이 지금보다 더 오래 측면에서 접근 방식을 분석 건의 할 것입니다. 현재 항목이 고유 경우입니다. 현재 항목을 의지하는 새 목록을 필요로하는 경우입니다. 거의 목록이 짧은 현재 필요가있다. 내가 도메인 특성을 가지고 있지 않더라도, 그것은 그 요구 사항이 변경 될 수 있다고 생각하는 스트레칭 정도는 아니다. 당신이 당신의 목록을 직렬화하는 경우, 당신은 더 정규화 디자인에 필요하지 않은 경직성에 굽고 있습니다. 많은 관계 : BTW, 그것은 반드시 전체 다수를 의미하지 않는다. 당신은 부모에 대한 외래 키와 항목에 대한 문자 열이 하나의 자식 테이블을 가질 수 있습니다.

    다른 사람들이 말씀하신 것을 외에도, 나는 당신이 지금보다 더 오래 측면에서 접근 방식을 분석 건의 할 것입니다. 현재 항목이 고유 경우입니다. 현재 항목을 의지하는 새 목록을 필요로하는 경우입니다. 거의 목록이 짧은 현재 필요가있다. 내가 도메인 특성을 가지고 있지 않더라도, 그것은 그 요구 사항이 변경 될 수 있다고 생각하는 스트레칭 정도는 아니다. 당신이 당신의 목록을 직렬화하는 경우, 당신은 더 정규화 디자인에 필요하지 않은 경직성에 굽고 있습니다. 많은 관계 : BTW, 그것은 반드시 전체 다수를 의미하지 않는다. 당신은 부모에 대한 외래 키와 항목에 대한 문자 열이 하나의 자식 테이블을 가질 수 있습니다.

    당신은 여전히 ​​목록을 직렬화의 길을 가고 싶은 경우에, 당신은 XML의 목록을 저장하는 것이 좋습니다. SQL Server와 같은 일부 데이터베이스는 심지어 XML 데이터 유형이있다. 내가 XML을 건의 할 것입니다 유일한 이유는 거의 정의에 의해,이 목록의 요구가 짧게는 것이다. 목록이 긴 경우, 일반적으로 직렬화하는 것은 끔찍한 방법입니다. 당신은 CSV 경로를 이동하는 경우, 당신은 당신이 인용 식별자를 사용하도록 강요하는 것을 의미 구분 기호가 포함 된 값에 대한 계정이 필요합니다. 목록이 짧은 것을 Persuming, 아마 당신이 CSV 또는 XML을 사용하는지 많은 차이를하지 않습니다.

  5. ==============================

    5.당신이 목록에 쿼리에 필요한 경우, 다음 테이블에 저장합니다.

    당신이 목록에 쿼리에 필요한 경우, 다음 테이블에 저장합니다.

    당신은 항상 목록을 원하는 경우에, 당신은 열에서 분리 된 목록으로 저장할 수 있습니다. 이 경우에도, 당신은 아주 특별한 이유가없는 한, 조회 테이블에 저장하지.

  6. ==============================

    6.간단한 답 : 만약, 만, 만약 당신이있는 거 특정 목록이 항상 목록으로 사용됩니다, 다음에 사용되지 않습니다 (예 : '0 \'등) 문자로 최종에 함께리스트에 가입 지금까지 텍스트, 저장 그. 당신이 그것을 검색 할 때 다음, 당신은 '\ 0'로 분할 할 수 있습니다. 이이 물건에 대해가는 다른 방법이 물론 있지만, 사람들은 특정 데이터베이스 공급 업체에 따라 달라집니다.

    간단한 답 : 만약, 만, 만약 당신이있는 거 특정 목록이 항상 목록으로 사용됩니다, 다음에 사용되지 않습니다 (예 : '0 \'등) 문자로 최종에 함께리스트에 가입 지금까지 텍스트, 저장 그. 당신이 그것을 검색 할 때 다음, 당신은 '\ 0'로 분할 할 수 있습니다. 이이 물건에 대해가는 다른 방법이 물론 있지만, 사람들은 특정 데이터베이스 공급 업체에 따라 달라집니다.

    예를 들어, 당신은 포스트 그레스 데이터베이스에서 JSON을 저장할 수 있습니다. 목록은 텍스트이며, 당신은 단지 더 번거 로움없이 목록을 원하는 경우에, 그것은 합리적인 타협이다.

    다른 사람은 직렬화의 제안을 감행했지만, 난 정말 그 직렬화가 좋은 아이디어라고 생각하지 않습니다 일부 데이터베이스에 대한 깔끔한 가지의 서로 다른 언어로 작성된 여러 프로그램이 서로 대화 할 수 있다는 것입니다. 그리고 프로그램은 리스프 프로그램을로드하고 싶어 잘 경우 모든 작업을 수행하지 않을 자바의 형식을 사용하여 직렬화.

    당신이 이런 종류의 작업을 수행 할 수있는 좋은 방법을 원하는 경우에 일반적으로 사용할 수 배열 또는-유사한 유형이 있습니다. 타입으로 인스턴스 이벤트 배열에 대한 포스트 그레스,과에서 (뿐만 아니라 배열 유형을 만약 당신이 원하는 경우, 텍스트의 배열을 저장하고, JSON을 사용하여 MySQL과 MS SQL 비슷한 트릭이 있고, IBM의 DB2에 제공 할 수 있습니다 자신의 ) 도움이 문서를 소유하고 있습니다. 이것에 대한 필요가 아니었다면이 너무 일반적인 없을 것이다.

    당신이 그 길을 가서 잃게 할 것이 순서 일의 무리로 목록의 개념입니다. 명목상 적어도, 데이터베이스는 하나의 값으로 필드를 취급합니다. 즉, 당신이 원하는 모든의 경우에, 당신은 그것을 위해 가야한다. 그것은 당신이 자신을 위해 확인해야 가치 판단이다.

  7. ==============================

    7.이 (아마 잔인한 것하지만 그뿐만 아니라 옵션이 될 것에서 XML은 매우 상세 및 / 직렬화입니다) 간단한 값이 다음은 당신이 필요로하는 모든해야 있다면 난 그냥, CSV로 저장하는 것입니다.

    이 (아마 잔인한 것하지만 그뿐만 아니라 옵션이 될 것에서 XML은 매우 상세 및 / 직렬화입니다) 간단한 값이 다음은 당신이 필요로하는 모든해야 있다면 난 그냥, CSV로 저장하는 것입니다.

    여기 LINQ와 CSV를 꺼내하는 방법에 대한 좋은 답변입니다.

  8. ==============================

    8.하나의 옵션은 답변에서 언급하지 않습니다. 당신은-해제 정상화하여 DB 설계를 할 수 있습니다. 그래서 당신은 두 개의 테이블이 필요합니다. 하나 개의 테이블은 적절한 목록을 포함 번 항목 행당, 다른 테이블은 (예를 들어, 코마 분리) 한 열의 전체 목록을 포함한다.

    하나의 옵션은 답변에서 언급하지 않습니다. 당신은-해제 정상화하여 DB 설계를 할 수 있습니다. 그래서 당신은 두 개의 테이블이 필요합니다. 하나 개의 테이블은 적절한 목록을 포함 번 항목 행당, 다른 테이블은 (예를 들어, 코마 분리) 한 열의 전체 목록을 포함한다.

    여기가 '전통'DB 설계는 다음과 같습니다

    List(ListID, ListName) 
    Item(ItemID,ItemName) 
    List_Item(ListID, ItemID, SortOrder)
    

    여기 드 ​​- 정규화 테이블은 다음과 같습니다

    Lists(ListID, ListContent)
    

    여기에 아이디어는 - 당신은 트리거 또는 응용 프로그램 코드를 사용하여 목록 테이블을 유지한다. 당신이 LIST_ITEM의 내용을 수정할 때마다, 목록에서 해당 행이 자동으로 업데이트됩니다. 당신은 대부분의 목록을 읽는다면 그것은 아주 잘 작동 할 수있다. 프로 - 당신은 하나 개의 문장에 목록을 읽을 수 있습니다. 단점 - 업데이트는 더 많은 시간과 노력을.

  9. ==============================

    9.당신이 정말로 컬럼에 저장하고이하고 싶었다면 지금 데이터베이스 지원 XML을 많이 쿼리 할. 당신이 쉼표로 구분 된 값으로 그들을 저장하고 기능을 구문 분석 할 수 쿼리하지 않으면 당신은 그들이 분리해야 할 때. 관계형 데이터베이스 정상화의 큰 부분을 사용하고자하는 경우 것은 같은 데이터의 분리가 비록 나는 다른 사람에 동의합니다. 나는 모든 데이터는하지만 관계형 데이터베이스에 맞는 것을 말하고 있지 않다. 데이터의 많은 모델에 맞지 않으면 당신은 항상 데이터베이스의 다른 유형으로 볼 수 있었다.

    당신이 정말로 컬럼에 저장하고이하고 싶었다면 지금 데이터베이스 지원 XML을 많이 쿼리 할. 당신이 쉼표로 구분 된 값으로 그들을 저장하고 기능을 구문 분석 할 수 쿼리하지 않으면 당신은 그들이 분리해야 할 때. 관계형 데이터베이스 정상화의 큰 부분을 사용하고자하는 경우 것은 같은 데이터의 분리가 비록 나는 다른 사람에 동의합니다. 나는 모든 데이터는하지만 관계형 데이터베이스에 맞는 것을 말하고 있지 않다. 데이터의 많은 모델에 맞지 않으면 당신은 항상 데이터베이스의 다른 유형으로 볼 수 있었다.

  10. ==============================

    10.나는 어떤 경우에는 생각, 당신은 쉼표 (,)로 분할하여 사진의 모든 ID를 연결할 수 있습니다, 예를 들어, 상품은 세부 정보를 보여주기 위해 몇 가지 사진을 보유하고, 데이터베이스의 항목 가짜 "목록"을 만들 수에 문자열을 저장 DB를, 그럼 당신은 당신이 그것을 필요로 할 때 문자열을 구문 분석 할 필요가있다. 지금은 웹 사이트에서 일하고 나는이 방법을 사용할 계획입니다.

    나는 어떤 경우에는 생각, 당신은 쉼표 (,)로 분할하여 사진의 모든 ID를 연결할 수 있습니다, 예를 들어, 상품은 세부 정보를 보여주기 위해 몇 가지 사진을 보유하고, 데이터베이스의 항목 가짜 "목록"을 만들 수에 문자열을 저장 DB를, 그럼 당신은 당신이 그것을 필요로 할 때 문자열을 구문 분석 할 필요가있다. 지금은 웹 사이트에서 일하고 나는이 방법을 사용할 계획입니다.

  11. from https://stackoverflow.com/questions/3070384/how-to-store-a-list-in-a-column-of-a-database-table by cc-by-sa and MIT license