it-swarm-ko.tech

SQL의 연결리스트

삽입이 간단하고 (매번 많은 항목을 다시 색인 할 필요가 없도록) mysql 데이터베이스에 링크 된 목록을 저장하는 가장 좋은 방법은 목록을 순서대로 쉽게 가져올 수 있습니다.

57
magicrobotmonkey

테이블에 'position'이라는 정수 열을 저장하십시오. 목록의 첫 번째 항목에는 0을, 두 번째 항목에는 1을 기록하십시오. 데이터베이스에서 해당 열을 색인화하고 값을 꺼내려면 해당 열을 기준으로 정렬하십시오.

 alter table linked_list add column position integer not null default 0;
 alter table linked_list add index position_index (position);
 select * from linked_list order by position;

인덱스 3에 값을 삽입하려면 행 3 이상의 위치를 ​​수정 한 후 다음을 삽입하십시오.

 update linked_list set position = position + 1 where position >= 3;
 insert into linked_list (my_value, position) values ("new value", 3); 
16
Adrian Dunston

Adrian의 솔루션을 사용하지만 1 씩 증가시키는 대신 10 또는 100 씩 증가시킵니다. 그러면 삽입물 아래에있는 모든 것을 업데이트하지 않고도 삽입하는 것의 차이의 절반으로 삽입을 계산할 수 있습니다. 평균 삽입 횟수를 처리 할 수있을 정도로 큰 숫자를 선택하십시오. 너무 작은 경우 삽입하는 동안 더 높은 위치로 모든 행을 업데이트해야합니다.

17
cfeduke

두 개의 자체 참조 열인 PreviousID 및 NextID가있는 테이블을 만듭니다. 항목이 목록에서 첫 번째 항목 인 경우 PreviousID는 null이고 마지막 항목 인 경우 NextID는 null입니다. SQL은 다음과 같습니다.

create table tblDummy
{
     PKColumn     int     not null, 
     PreviousID     int     null, 
     DataColumn1     varchar(50)     not null, 
     DataColumn2     varchar(50)     not null,  
     DataColumn3     varchar(50)     not null, 
     DataColumn4     varchar(50)     not null, 
     DataColumn5     varchar(50)     not null, 
     DataColumn6     varchar(50)     not null, 
     DataColumn7     varchar(50)     not null, 
     NextID     int     null
}
15
B0fh

테이블의 재귀 포인터를 사용하여 연결된 목록을 저장할 수 있습니다. 이것은 SQL에 저장되는 것과 거의 동일한 계층이며 재귀 연결 패턴을 사용하고 있습니다.

그것에 대해 더 자세히 배울 수 있습니다 here .

이게 도움이 되길 바란다.

4
user9252

가장 간단한 옵션은 목록 항목 당 행, 항목 위치 열 및 항목의 다른 데이터 열이 포함 된 테이블을 만드는 것입니다. 그런 다음 위치 열에서 ORDER BY를 사용하여 원하는 순서로 검색 할 수 있습니다.

create table linked_list
(   list_id   integer not null
,   position  integer not null 
,   data      varchar(100) not null
);
alter table linked_list add primary key ( list_id, position );

목록을 조작하려면 위치를 업데이트 한 다음 필요에 따라 레코드를 삽입/삭제하십시오. 인덱스 3의 목록 1에 항목을 삽입하려면

begin transaction;

update linked_list set position = position + 1 where position >= 3 and list_id = 1;

insert into linked_list (list_id, position, data)
values (1, 3, "some data");

commit;

목록의 조작에는 여러 명령이 필요할 수 있으므로 (예를 들어 삽입에는 INSERT 및 UPDATE가 필요함) 항상 트랜잭션 내에서 명령을 수행하십시오.

이 간단한 옵션의 변형은 100과 같이 각 항목마다 위치를 증분시키는 것이므로 INSERT를 수행 할 때 항상 다음 요소의 위치를 ​​다시 매길 필요는 없습니다. 그러나 이렇게하려면 다음 요소를 늘릴 때 약간의 노력을 기울여야하므로 단순성이 떨어지지 만 인서트가 많은 경우 성능이 향상됩니다.

요구 사항에 따라 다음과 같은 다른 옵션이 호소 될 수 있습니다.

  • 목록에서 많은 조작을 수행하고 많은 검색을 수행하지 않으려면 위치 열을 사용하는 대신 목록의 다음 항목을 가리키는 ID 열을 사용하는 것이 좋습니다. 그런 다음 항목을 순서대로 가져 오려면 목록을 검색 할 때 논리를 반복해야합니다. 이것은 저장된 proc에서 비교적 쉽게 구현 될 수 있습니다.

  • 목록이 많은 경우 목록을 텍스트/이진으로 직렬화하고 역 직렬화하는 빠른 방법이며 전체 목록 만 저장하고 검색하려는 경우 전체 목록을 단일 열에 단일 값으로 저장하십시오. 아마 당신이 여기서 요구하는 것이 아닐 것입니다.

4
Rory

https://dba.stackexchange.com/questions/46238/linked-list-in-sql-and-trees 빠른 삽입 및 순서를 위해 부동 소수점 위치 열을 사용하는 트릭을 제안합니다.

또한 특수 SQL Server 2014 hierarchyid 기능에 대해서도 언급합니다.

2
Vadzim

이것은 내가 잠시 동안 알아 내려고 노력한 것입니다. 지금까지 찾은 가장 좋은 방법은 다음 형식 (의사 코드)을 사용하여 연결된 목록에 대한 단일 테이블을 만드는 것입니다.

연결 목록 (

  • key1,
  • 정보,
  • 키 2

)

key1이 시작점입니다. Key2는 다음 열에서 자신과 연결되는 외래 키입니다. 따라서 열은 다음과 같은 것을 연결합니다.

col1

  • key1 = 0,
  • 정보 = '안녕하세요'
  • 키 2 = 1

Key1은 col1의 기본 키입니다. key2는 col2 의 key1로 이어지는 외래 키입니다.

col2

  • key1 = 1,
  • 정보 = 'wassup'
  • key2 = null

col2의 key2는 아무것도 가리 키지 않기 때문에 null로 설정됩니다

테이블에 열을 처음 입력 할 때 key2가 null로 설정되어 있는지 확인해야합니다. 그렇지 않으면 오류가 발생합니다. 두 번째 열을 입력 한 후에는 첫 번째 열의 key2를 두 번째 열의 기본 키로 설정할 수 있습니다.

이렇게하면 한 번에 많은 항목을 입력하는 것이 가장 좋은 방법이며 외래 키를 적절하게 설정하십시오 (또는 GUI를 직접 작성하십시오)

다음은 내가 준비한 실제 코드입니다 (모든 실제 코드는 MSSQL에서 작동했습니다. 사용중인 SQL 버전에 대한 조사를 원할 수도 있습니다!) :

createtable.sql

create table linkedlist00 (

key1 int primary key not null identity(1,1),

info varchar(10),

key2 int

)

register_foreign_key.sql

alter table dbo.linkedlist00

add foreign key (key2) references dbo.linkedlist00(key1)

* 2 단계로 이루어져야하므로 두 개의 별도 파일에 넣었습니다. 외래 키가 참조 할 테이블이 아직 존재하지 않기 때문에 MSSQL에서는 한 번에 수행 할 수 없습니다.

연결 목록은 특히 일대 다 관계에서 강력합니다. 외래 키 배열을 만들고 싶었다면? 글쎄, 이것은 그것을하는 한 가지 방법입니다! 연결된 목록 테이블의 첫 번째 열을 가리키는 기본 테이블을 만든 다음 "정보"필드 대신 원하는 정보 테이블에 외래 키를 사용할 수 있습니다.

예:

양식을 유지하는 관료제가 있다고 가정 해 봅시다.

그들이 파일 캐비닛 이라는 테이블을 가지고 있다고 가정 해 봅시다.

파일 캐비닛(

  • 캐비닛 ID (pk)
  • 파일 ID (fk))

각 열에는 캐비닛의 기본 키와 파일의 외래 키가 포함됩니다. 이 파일들은 세금 양식, 건강 보험 서류, 견학 허가 전표 등이 될 수 있습니다

파일

  • 파일 ID (pk)

  • 파일 ID (fk)

  • 다음 파일 ID (fk)

)

파일의 컨테이너 역할을합니다

파일(

  • 파일 ID (pk)

  • 파일에 대한 정보

)

이것은 특정 파일입니다

이를 수행하는 더 좋은 방법이있을 수 있으며 특정 요구에 따라있을 수 있습니다. 이 예는 가능한 사용법을 보여줍니다.

2
HumbleWebDev

이 게시물은 오래되었지만 여전히 .02 $를 줄 것입니다. 테이블 또는 레코드 세트의 모든 레코드를 업데이트하면 순서를 해결하기가 미치게 들립니다. 인덱싱의 양도 미쳤지 만 대부분이 그것을 받아 들인 것처럼 들립니다.

미친 해결책은 업데이트를 줄이고 색인을 생성하기 위해 두 개의 테이블을 만드는 것입니다 (대부분의 경우에는 모든 레코드를 하나의 테이블로 정렬합니다). 정렬중인 목록의 레코드를 보유하는 테이블 A와 순서 레코드를 문자열로 그룹화하고 보유하는 테이블 B. 주문 문자열은 웹 서버 또는 웹 페이지 응용 프로그램의 브라우저 계층에서 선택한 레코드를 주문하는 데 사용할 수있는 배열을 나타냅니다.

Create Table A{
Id int primary key identity(1,1),
Data varchar(10) not null
B_Id int
}

Create Table B{
Id int primary key Identity(1,1),
GroupName varchat(10) not null,
Order varchar(max) null
}

주문 찌르기의 형식은 id, position 및 문자열을 split ()하기위한 구분 기호 여야합니다. jQuery UI의 경우 .sortable ( 'serialize') 함수는 목록에서 각 레코드의 ID와 위치를 포함하는 POST friendly) 인 주문 문자열을 출력합니다.

진정한 마술은 저장된 순서 문자열을 사용하여 선택한 목록의 순서를 변경하는 방법입니다. 이것은 빌드하는 응용 프로그램에 따라 다릅니다. 다음은 jQuery의 항목 목록을 다시 정렬하는 예제입니다. http://ovisdevelopment.com/oramincite/?p=155

2
FlyTigert

SERIAL '인덱스'를 100 씩 늘리지 만 '인덱스'를 Prev + Next/2와 같은 중간 값을 수동으로 추가하십시오. 100 행을 포화시킨 경우 인덱스를 다시 100으로 다시 정렬하십시오.

이것은 1 차 색인으로 순서를 유지해야합니다.

1
Stephen

내가 생각할 수있는 몇 가지 접근 방식이 있는데, 각 방법마다 복잡성과 유연성 수준이 다릅니다. 귀하의 목표는 실제 연결 목록으로 스토리지를 요구하지 않고 검색 순서를 유지하는 것입니다.

가장 간단한 방법은 테이블의 각 레코드에 서수 값을 할당하는 것입니다 (예 : 1, 2, 3, ...). 그런 다음 레코드를 검색 할 때 순서 열에서 순서대로 지정하여 순서대로 되 돌리십시오.

이 방법을 사용하면 목록의 멤버 자격에 관계없이 레코드를 검색 할 수 있지만 한 목록의 멤버 자격 만 허용하고 레코드가 속하는 목록을 표시하기 위해 추가 "list id"열이 필요할 수 있습니다.

좀 더 정교하지만 더 유연한 접근 방식은 멤버쉽에 대한 정보를 목록에 또는 별도의 테이블에 저장하는 것입니다. 테이블에는 3 개의 열이 필요합니다. 목록 ID, 서수 값 및 데이터 레코드에 대한 외래 키 포인터. 이 방법에서 기본 데이터는 목록의 멤버 자격에 대해 아무 것도 알지 못하며 여러 목록에 쉽게 포함될 수 있습니다.

1
Mike Monette

Datetime 유형의 생성 된 열과 int의 위치 열을 추가하는 것이 훨씬 간단하다고 생각합니다. 이제 select 문에서 order by 위치, 작성된 desc 옵션 및 목록이 순서대로 가져옵니다.

1
Poncho

열에 오프셋 (목록 색인 위치)이 포함 된 목록을 저장하여 목록을 저장할 수 있습니다. 중간에있는 삽입은 새 상위보다 많이 증가한 다음 삽입을 수행합니다.

0
Daniel Papasian