Làm cách nào để triển khai cơ sở dữ liệu / bảng dưới dạng ngăn xếp


11

Tôi có một máy trạng thái cần đẩy / bật một số tên tệp cho những người dùng khác nhau. Theo truyền thống, tôi thường sử dụng ngăn xếp làm lựa chọn cấu trúc dữ liệu, nhưng điều này cần được thực hiện bằng cơ sở dữ liệu vì tôi không có cách giữ cấu trúc dữ liệu giữa các yêu cầu web đến.

Tôi đã tự hỏi điều gì sẽ là một cách tốt để thực hiện chức năng ngăn xếp bằng cơ sở dữ liệu?

Tôi cần hỗ trợ:

  • push (fileName, user): đẩy fileName cho người dùng
  • pop (người dùng): Pop tên tệp cao nhất cho người dùng

CHỈNH SỬA :

Tôi đang tạo ra một ý tưởng, và vì vậy tôi đang sử dụng sqlite3 với python.

Cảm ơn!


Bạn có mong đợi cùng một người dùng có nhiều kết nối đồng thời không? khối lượng bao nhiêu? Những gì động cơ Db quá xin vui lòng?
gbn

@gbn Cuối cùng, cùng một người dùng có thể có các kết nối đồng thời. Nhưng hiện tại, tôi đang tạo ra một ý tưởng và tôi giả sử một kết nối duy nhất cho mỗi người dùng
brainydexter 23/211

@brainydexter Tôi rất muốn biết bạn đang cố gắng làm gì. Tôi có cảm giác rằng bạn có thể đang tạo ra giải pháp sai cho vấn đề của bạn. Bạn có thể muốn xem xét cho chúng tôi biết vấn đề của bạn và yêu cầu con đường tốt nhất để giải quyết nó. Việc thực hiện một ngăn xếp như một bảng cơ sở dữ liệu nghe có vẻ là một ý tưởng tồi.
xenoterracide

@xenoterracide: Mục đích chung của những gì tôi đang cố gắng thực hiện tại SO: stackoverflow.com/questions/5145051/ Thẻ Stack không hoạt động hoàn toàn, vì vậy tôi vẫn đang tìm giải pháp cho vấn đề này.
brainydexter

1
@brainydexter không thực sự ngạc nhiên, SQL là một ngôn ngữ khủng khiếp để thực hiện một ngăn xếp, bởi vì theo định nghĩa quan hệ, một tập hợp không có thứ tự, vì vậy ngăn xếp của bạn, sẽ không có thứ tự và bạn sẽ phải sắp xếp nó. Có lẽ một phần của vấn đề của bạn là bạn đang nói với mọi người bạn muốn câu trả lời là gì và bạn đang hỏi làm thế nào. Thay vì nói với họ vấn đề là gì, và hỏi cái gì. Ngay cả câu hỏi SO của bạn dẫn câu trả lời cho một cái gì đó cụ thể. Hãy thử hỏi giải pháp mà bạn sẽ không nghĩ tới.
xenoterracide

Câu trả lời:


6

Nếu bạn đang hỏi về việc sử dụng cơ sở dữ liệu nào, nó thực sự phụ thuộc vào sở thích cá nhân và những gì bạn muốn từ cơ sở dữ liệu đó. Vì tôi chỉ quen với MySQL, tôi sẽ trả lời phần khác của câu hỏi giả sử MySQL:

bạn sẽ muốn sử dụng INNODBvì bảng của bạn sẽ được viết nhiều và đối với các bảng lớn, tính năng khóa hàng của INNODB sẽ là cứu cánh hơn MyISAM.

Theo như thiết kế bảng, có vẻ như bạn chỉ thực sự cần một bảng:

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`;

Tôi đã sử dụng một cột 'id' tùy ý được đặt AUTO_INCREMENTvì khóa chính được sao chép trong mỗi mục nhập của mọi chỉ mục. Vì vậy, thực hiện khóa chính của (người dùng, tên tệp) có thể gây ra sự cố về hiệu suất nếu tên tệp của bạn quá dài.

Kích thước của cột 'id' của bạn phụ thuộc vào mức độ lớn của bảng của bạn. Smallint chưa ký sẽ cung cấp cho bạn 65k hàng.

Tên người dùng và tên tệp là varchar, bởi vì chúng sẽ thay đổi theo chiều dài.

Đây date_insertchỉ là một cách để đặt hàng kết quả của bạn dựa trên thời điểm nó được chèn (hữu ích cho POP của bạn)


Tôi đã nghĩ đến việc kết hợp (id, user) làm khóa chính, vì tôi muốn đẩy hoặc bật dựa trên người dùng. Bạn nghĩ sao ? Ngoài ra, đối với hoạt động POP, sẽ tốt hơn nếu tìm bản ghi cho người dùng có id tối đa?
brainydexter

@brainydexter dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html có một số hạn chế đối với tính năng tự động (nó sẽ sử dụng lại các giá trị tự động 'thấp hơn' trong một số trường hợp hiếm hoi nhất định). bởi vì đó là một khả năng tôi đã đi với một trường date_insert. Đối với việc sử dụng (id, người dùng) làm Khóa chính, không có điểm nào ngoại trừ việc chiếm thêm dung lượng. ID xác định duy nhất hàng. chỉ 'người dùng' tự nó không xác định hàng, vì vậy bạn chỉ có thể có một chỉ mục không duy nhất trên 'userID' thay vì duy nhất (tên người dùng, tên tệp) nếu bạn muốn.
Derek Downey

6

Nếu bạn xem xét một cơ sở dữ liệu Oracle, bạn nên xem xét sử dụng Xếp hàng nâng cao với mẫu dequeue LIFO (cuối cùng ở trước ra trước) .

Ở cấp độ cơ bản nhất của việc xếp hàng, một nhà sản xuất sẽ liệt kê một hoặc nhiều tin nhắn vào một hàng đợi. Mỗi tin nhắn được xử lý và xử lý một lần bởi một trong những người tiêu dùng. Một tin nhắn sẽ ở trong hàng đợi cho đến khi một người tiêu dùng loại bỏ nó hoặc tin nhắn hết hạn. Một nhà sản xuất có thể quy định một sự chậm trễ trước khi tin nhắn có sẵn được tiêu thụ và một thời gian sau đó tin nhắn hết hạn. Tương tự như vậy, một người tiêu dùng có thể chờ đợi khi cố gắng loại bỏ một tin nhắn nếu không có tin nhắn nào. Một chương trình hoặc ứng dụng đại lý có thể đóng vai trò là nhà sản xuất và người tiêu dùng.


thiết lập sản xuất / tiêu dùng cổ điển. Cảm ơn thông tin, tôi sẽ ghi nhớ nó.
brainydexter

Hy vọng rằng MySQL sẽ có được một số chức năng Hàng đợi Adance ngay bây giờ khi Oracle "sở hữu" mysql ...
Derek Downey

1
@DTest: tất nhiên, cũng có khả năng khác biệt là giờ đây, myQuery ít có khả năng nhận được các tính năng nâng cao, do đó, Oracle có thể phân biệt giữa phần mềm miễn phí và phần mềm bạn phải trả tiền.
Joe

@Joe cảm ơn vì đã phá hỏng cuối tuần của tôi với suy nghĩ đó!
Derek Downey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.