데이터베이스 / 테이블을 스택으로 구현하는 방법


11

다른 사용자를 위해 일부 파일 이름을 푸시 / 팝 해야하는 상태 시스템이 있습니다. 전통적으로 스택을 데이터 구조의 선택으로 사용하지만 들어오는 웹 요청간에 데이터 구조를 유지할 방법이 없기 때문에 데이터베이스를 사용하여 수행해야합니다.

데이터베이스를 사용하여 스택 기능을 구현하는 좋은 방법이 무엇인지 궁금합니다.

나는 지원해야한다 :

  • push (fileName, user) : 사용자의 fileName을 푸시합니다
  • pop (user) : 사용자의 최상위 파일 이름 팝

편집 :

아이디어를 프로토 타이핑하고 있으므로 sqlite3을 파이썬과 함께 사용하고 있습니다.

감사!


동일한 사용자가 여러 개의 동시 연결을 가질 것으로 예상합니까? 어떤 볼륨? 무슨 Db 엔진도 제발?
gbn

@gbn 결국 같은 사용자가 동시에 연결할 수 있습니다. 하지만 지금, 나는 아이디어를 프로토 타입, 그리고 난 사용자 당 단일 연결을 가정
brainydexter

@ brainydexter 나는 당신이 무엇을하려고하는지 알고 싶습니다. 나는 당신이 당신의 문제에 대한 잘못된 해결책을 만들고 있다고 생각합니다. 문제를 알려주고 최선의 방법으로 문제를 해결하는 것이 좋습니다. 데이터베이스 테이블로 스택을 구현하는 것은 나쁜 생각처럼 들립니다.
xenoterracide

@ xenoterracide : SO에서하려고하는 전반적인 의도 : stackoverflow.com/questions/5145051/… 스택이 완전히 작동하지 않았으므로 여전히 해결책을 찾고 있습니다.
brainydexter

1
@brainydexter는 놀랍지 않지만 SQL은 스택을 구현하는 끔찍한 언어입니다. 관계 정의에 따르면 세트가 정렬되지 않으므로 스택에 순서가 없으므로 정렬해야합니다. 아마도 문제의 일부는 사람들에게 당신이 원하는 답변을 말하고 있고, 방법을 묻는 것입니다. 그들에게 문제가 무엇인지 말하고 묻는 것 대신에. 당신의 SO 질문조차도 특정 무언가에 대한 답을 이끌어냅니다. 생각하지 않는 솔루션을 요청하십시오.
xenoterracide

답변:


6

어떤 데이터베이스를 사용할 것인지 묻는다면 실제로 개인 취향과 원하는 데이터베이스에 따라 다릅니다. MySQL에만 익숙하기 때문에 MySQL을 가정하여 질문의 다른 부분에 대답합니다.

INNODB테이블이 쓰기 집약적이기 때문에 사용하고 싶고 큰 테이블의 경우 INNODB의 행 잠금이 생명을 구할 수 있습니다 MyISAM.

테이블 디자인에 관해서는 실제로 하나의 테이블 만 필요한 것 같습니다.

CREATE TABLE `wordpress`.`<table_name>` (
`id` smallint(4) NOT NULL AUTO_INCREMENT UNSIGNED,
`user` varchar(30) NOT NULL,
`filename` varchar(255) NOT NULL,
`date_insert` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE `userFile`(user, filename)
) ENGINE=`InnoDB`;

AUTO_INCREMENT기본 키가 모든 인덱스의 모든 항목에 복제되기 때문에 임의의 'id'열을 설정했습니다 . 따라서 파일 이름이 너무 길면 기본 키 (사용자, 파일 이름)를 수행하면 성능 문제가 발생할 수 있습니다.

'ID'열의 크기는 테이블이 얼마나 커질 지에 따라 다릅니다. 부호없는 스몰 린트는 65k 행을 제공합니다.

사용자와 파일 이름은 varchar입니다. 길이가 크게 다르기 때문입니다.

date_insert이 (당신의 POP에 도움)에 삽입되었을 때를 기준으로 결과를 정렬하는 단지 방법입니다


사용자를 기반으로 푸시 또는 팝하고 싶기 때문에 (ID, 사용자) 조합을 기본 키로 생각하고있었습니다. 어떻게 생각해 ? 또한 POP 작업의 경우 최대 ID를 가진 사용자의 레코드를 찾는 것이 더 좋지 않습니까?
brainydexter

@brainydexter dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html는 자동 증가에 일부 제한 (이 '낮은'드문 경우에 자동 증가 값 사용을 다시 것)가 있습니다. date_insert 필드를 사용했을 가능성이 있기 때문입니다. 기본 키로 (id, user)를 사용하는 경우 더 많은 스토리지를 사용하는 것 외에는 아무런 의미가 없습니다. ID는 행을 고유하게 식별합니다. 'user'자체만으로는 행을 식별하지 않으므로 원하는 경우 고유 한 (user, filename) 대신 'userID'에 고유하지 않은 인덱스를 가질 수 있습니다.
데릭 다우니

6

Oracle 데이터베이스를 고려하는 경우 LIFO (last in first out) 대기열 제거 패턴 과 함께 고급 큐 사용을 고려해야 합니다.

가장 기본적인 큐 수준에서 한 생산자가 하나 이상의 메시지를 하나의 큐에 넣습니다. 각 메시지는 소비자 중 한 사람에 의해 대기열에서 제거되고 처리됩니다. 소비자는 메시지를 대기열에서 제외하거나 메시지가 만료 될 때까지 메시지가 큐에 남아 있습니다. 생산자는 메시지를 사용할 수있게되기 전의 지연과 메시지 만료 시간을 규정 할 수 있습니다. 마찬가지로, 메시지를 사용할 수없는 경우 소비자는 메시지를 대기열에서 제외하려고 할 때까지 기다릴 수 있습니다. 에이전트 프로그램 또는 응용 프로그램은 생산자와 소비자의 역할을 모두 수행 할 수 있습니다.


클래식 프로듀서 / 소비자 설정. 정보 주셔서 감사합니다, 나는 그것을 명심할 것입니다.
brainydexter

희망 MySQL은 이제 오라클이 MySQL을 ... "소유"한 일부 Adance 큐 기능을 얻을 것이다
데릭 다우니

1
@DTest : 물론, mySQL이 이제 고급 기능을 얻을 가능성이 적기 때문에 Oracle은 무료 소프트웨어와 유료 소프트웨어를 구별 할 수 있습니다.
Joe

@Joe 그 생각으로 주말을 망쳐 줘서 고마워!
데릭 다우니
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.