[SQL] SQL에서 링크 된 목록
SQLSQL에서 링크 된 목록
그 삽입이 간단 그래서 가장 좋은 방법은 MySQL 데이터베이스에 링크 된 목록을 저장하기 위해 뭐죠하고 목록을 쉽게 순서로 뽑아 될 수있는 (즉, 당신은 물건의 무리마다 인덱싱 필요 없다).
해결법
-
==============================
1.'위치'라는 테이블에 정수 열을 저장합니다. 목록의 첫 번째 항목에 대해 0, 두 번째 항목에 대한 1 등 지수를 기록하는 데이터베이스의 열, 당신은 종류의 그 열을 기준으로, 당신의 가치를 끌어 할 때.
'위치'라는 테이블에 정수 열을 저장합니다. 목록의 첫 번째 항목에 대해 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);
-
==============================
2.대신 10 개 또는 100 그리고 삽입으로 1 씩 증가의 아드리안의 솔루션을 사용하면 삽입 아래에 업데이트 모든 것을하지 않고도 사이에 삽입하는지의 차이의 절반에 계산 될 수있다. 삽입의 평균 수를 처리 할 수 충분히 큰 선택 -의 너무 작은 다음 삽입시 더 높은 위치에 모든 행을 업데이트하기 후퇴해야합니다.
대신 10 개 또는 100 그리고 삽입으로 1 씩 증가의 아드리안의 솔루션을 사용하면 삽입 아래에 업데이트 모든 것을하지 않고도 사이에 삽입하는지의 차이의 절반에 계산 될 수있다. 삽입의 평균 수를 처리 할 수 충분히 큰 선택 -의 너무 작은 다음 삽입시 더 높은 위치에 모든 행을 업데이트하기 후퇴해야합니다.
-
==============================
3.이 자기 참조 열 PreviousID 및 NextID있는 테이블을 만들 수 있습니다. 항목이 목록의 첫 번째 일 경우 PreviousID는 지난 경우, NextID가 null이됩니다, null가됩니다. 는 SQL은 다음과 같이 보일 것입니다 :
이 자기 참조 열 PreviousID 및 NextID있는 테이블을 만들 수 있습니다. 항목이 목록의 첫 번째 일 경우 PreviousID는 지난 경우, NextID가 null이됩니다, 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 }
-
==============================
4.가장 간단한 방법은 항목에서 다른 데이터에 대한 목록 항목, 항목 위치에 대한 열 및 열 당 행과 테이블을 만드는 것입니다. 그런 다음 원하는 순서대로 검색 할 위치 열에 ORDER BY를 사용할 수 있습니다.
가장 간단한 방법은 항목에서 다른 데이터에 대한 목록 항목, 항목 위치에 대한 열 및 열 당 행과 테이블을 만드는 것입니다. 그런 다음 원하는 순서대로 검색 할 위치 열에 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 필요합니다) 당신은 항상 트랜잭션 내에서 명령을 수행 할 수 있도록.
이 간단한 옵션의 변화는, 당신은 INSERT를 수행 할 때 항상 다음과 같은 요소의 위치 번호를 다시 할 필요가 없습니다 그래서 100을 말할 위치에 각 항목에 대한 몇 가지 요인에 의해 증가하는 것입니다. 당신이 많은 삽입해야합니다 경우 잃게 단순하지만 이득 성능 때문에 그러나, 이것은 다음과 같은 요소를 증가 할 때 해결하기 위해 좀 더 노력이 필요합니다.
같은 다른 옵션을 끌 수있는 요구 사항에 따라 :
-
==============================
5.링크 된 목록은 테이블에 재귀 포인터를 사용하여 저장할 수 있습니다. 이것은 매우 거의 같은 계층 구조가 SQL에서 저장되고이 재귀 관계 패턴을 사용하고 있습니다.
링크 된 목록은 테이블에 재귀 포인터를 사용하여 저장할 수 있습니다. 이것은 매우 거의 같은 계층 구조가 SQL에서 저장되고이 재귀 관계 패턴을 사용하고 있습니다.
당신은 여기에 대한 자세한 내용은 (뒤로 기계 링크) 할 수 있습니다.
이게 도움이 되길 바란다.
-
==============================
6.복잡성과 유연성의 서로 다른 수준의 각 내가 바로 떨어져 생각할 수있는 몇 가지 방법이 있습니다. 나는 당신의 목표는 오히려 실제 링크 된 목록으로 저장을 필요로하는 것보다, 검색에서 순서를 유지하는 것입니다 있으리라 믿고있어.
복잡성과 유연성의 서로 다른 수준의 각 내가 바로 떨어져 생각할 수있는 몇 가지 방법이 있습니다. 나는 당신의 목표는 오히려 실제 링크 된 목록으로 저장을 필요로하는 것보다, 검색에서 순서를 유지하는 것입니다 있으리라 믿고있어.
가장 간단한 방법은, 테이블의 각 레코드에 대한 순서 값을 할당하는 것 (예를 들어 1, 2, 3, ...). 당신이 기록을 검색 할 때 다음, 주문 별 서수 열에 순서로 돌아갈를 지정합니다.
이 방법은 또한 당신이 목록에서 회원에 관계없이 레코드를 검색 할 수 있습니다,하지만 하나의 목록에서 회원 가입을 허용하고, 레코드가 속한 목록에 표시하기 위해 추가 "목록 ID가"열을 필요로 할 수있다.
약간 더 정교한뿐만 아니라 더 유연한 접근 방식은 별도의 테이블에서 목록 또는 목록의 구성원에 대한 정보를 저장하는 것입니다. 테이블은 3 열을 필요 : 목록의 ID, 서수 값 및 데이터 레코드에 대한 외래 키 포인터. 이 방법에서 기본 데이터는 목록의 회원 자격에 대해 아무것도 알고, 쉽게 여러 목록에 포함 할 수 있습니다.
-
==============================
7.이 포스팅은 오래된하지만 여전히 내 0.02 $을 줄 것입니다. 테이블이나 레코드 세트의 모든 레코드를 업데이트 순서를 해결하기 위해 미친 소리. 또한 미친 색인의 양,하지만 대부분의 같은 소리는 그것을 받아 들였다.
이 포스팅은 오래된하지만 여전히 내 0.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, 위치하여 문자열을 분할 일부 분리 ()해야한다. jQuery를 UI의 경우에 .sortable ( '직렬화') 기능리스트의 각 레코드의 ID와 위치를 포함하는 POST 친화적 인 당신 순서 문자열을 출력한다.
진짜 마법은 저장된 순서 문자열을 사용하여 선택한 목록 순서를 선택하는 방법입니다. 이것은 당신이 구축하는 응용 프로그램에 따라 달라집니다. 여기 예제는 jQuery를에서 항목의 목록 순서를 다시입니다 : http://ovisdevelopment.com/oramincite/?p=155
-
==============================
8.https://dba.stackexchange.com/questions/46238/linked-list-in-sql-and-trees 빠른 삽입 및 주문 부동 소수점 위치 열을 사용하는 트릭을 제안합니다.
https://dba.stackexchange.com/questions/46238/linked-list-in-sql-and-trees 빠른 삽입 및 주문 부동 소수점 위치 열을 사용하는 트릭을 제안합니다.
또한 SQL 서버에게 2014 HIERARCHYID 기능을 전문 언급하고있다.
-
==============================
9.이것은 자신 동안을 위해 내가 알아 내기 위해 노력했습니다 무언가이다. 지금까지 발견 한 가장 좋은 방법은 (이것은 의사 코드) 다음 형식을 사용하여 링크 된 목록을 하나의 테이블을 만드는 것입니다 :
이것은 자신 동안을 위해 내가 알아 내기 위해 노력했습니다 무언가이다. 지금까지 발견 한 가장 좋은 방법은 (이것은 의사 코드) 다음 형식을 사용하여 링크 된 목록을 하나의 테이블을 만드는 것입니다 :
LinkedList의 (
)
키 1은 시작 지점입니다. 키 2는 다음 칼럼에서 자체에 연결하는 외래 키입니다. 당신의 열은 다음과 같이 링크 뭔가 연결됩니다 그래서
COL1
COL1의 기본 키는 키 1입니다. 키 2는 외부 키 COL2의 키 1을 선도하고 있습니다
COL2
그것은 아무것도 가리 키지 않기 때문에 COL2에서 키 2는 널 (null)로 설정
먼저 테이블에 열을 입력하면 확인 키 2가 null로 설정되어 있는지 확인해야합니다 또는 오류가 발생합니다. 두 번째 열을 입력 한 후 되돌아 가서 두 번째 컬럼의 기본 키에 첫 번째 열의 설정 키 2 수 있습니다.
이 후, 한 번에 여러 항목을 입력 돌아가서 따라 외래 키를 설정 (또는 당신을 위해 않습니다 만하는 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)
이 두 단계로 수행되어야하기 때문에 * 나는 두 개의 별도의 파일에 넣어. 테이블을 참조하는 외래 키 아직 존재하지 않기 때문에 MSSQL, 당신은 한 번에 그것을 할 수 있도록하지 않습니다.
링크 된 목록 일대 다 관계에서 특히 강력하다. 혹시 외래 키의 배열을 만들기 위해 싶었던한다면? 그럼이 그것을 할 수있는 하나의 방법입니다! 당신은 연결된 목록 테이블의 첫 번째 열, 다음 대신 "정보"필드에 포인트가, 당신이 원하는 정보 테이블에 외래 키를 사용할 수있는 기본 테이블을 만들 수 있습니다.
예:
의 당신이 형태를 유지하는 관료 있다고 가정 해 봅시다.
하자 그들이 테이블라는 파일 캐비닛이 있다고
파일 캐비닛(
각 열은 캐비닛과 파일에 대한 외래 키에 대한 기본 키가 포함되어 있습니다. 이 파일은 세금 양식, 건강 보험 논문, 견학 권한 전표 등이 될 수
파일 (
)
이것은 파일에 대한 컨테이너의 역할
파일(
)
이 특정 파일입니다
이 작업을 수행하는 더 나은 방법이있을 수 있으며, 사용자의 특정 요구에 따라,이 있습니다. 이 예는 가능한 한 사용 방법을 보여줍니다.
-
==============================
10.나는 간단한의 많은 그래서 지금 당신은 select 문 사용 위치하여 순서에 중복 위치가 생성 내림차순 옵션을 선택하고 목록 순서대로 페치 될 것입니다 수, 날짜 시간 유형 및 INT의 위치 컬럼의 생성 된 열을 추가 생각합니다.
나는 간단한의 많은 그래서 지금 당신은 select 문 사용 위치하여 순서에 중복 위치가 생성 내림차순 옵션을 선택하고 목록 순서대로 페치 될 것입니다 수, 날짜 시간 유형 및 INT의 위치 컬럼의 생성 된 열을 추가 생각합니다.
-
==============================
11.(100)에 의해 SERIAL '인덱스'증가하지만, 수동으로 '인덱스'100 단위로 인덱스 다시 재정렬, 이전 + 다음 / 2. 당신이 이제까지 100 개 행을 포화 경우에 동일과 중간 값을 추가합니다.
(100)에 의해 SERIAL '인덱스'증가하지만, 수동으로 '인덱스'100 단위로 인덱스 다시 재정렬, 이전 + 다음 / 2. 당신이 이제까지 100 개 행을 포화 경우에 동일과 중간 값을 추가합니다.
이는 주 인덱스 순서를 유지해야한다.
-
==============================
12.중간에 삽입 한 후 상기 새로운 부모 모두를 증가시킨 후 삽입 하 -리스트가 칼럼 오프셋 (목록 인덱스 위치)를 포함함으로써 저장 될 수있다.
중간에 삽입 한 후 상기 새로운 부모 모두를 증가시킨 후 삽입 하 -리스트가 칼럼 오프셋 (목록 인덱스 위치)를 포함함으로써 저장 될 수있다.
from https://stackoverflow.com/questions/65205/linked-list-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 쿼리, 주어진 좌표에 의해 가까운 곳을 선택 [중복] (0) | 2020.05.19 |
---|---|
[SQL] 때 왼쪽 외부 조인을 사용 하는가? (0) | 2020.05.19 |
[SQL] 조건 SQL 합 (0) | 2020.05.19 |
[SQL] 방법 정규식에서 MySQL의 쿼리 (0) | 2020.05.19 |
[SQL] 서브 쿼리와 MySQL을 업데이트 쿼리 (0) | 2020.05.19 |