2009-11-09 29 views
26

Hiện tại tôi có một ứng dụng web nơi người dùng có thể sử dụng danh sách thả xuống để tạo các câu lệnh SQL SELECT như sau:Làm cách nào để triển khai logic boolean thân thiện với người dùng trong giao diện biểu mẫu web?

Chọn cột thả xuống | Toán tử thả xuống (=! => < < => =) | Trình đơn thả xuống chọn giá trị

Người dùng có thể thực hiện việc này nhiều lần và "bộ lọc" hiện được tất cả AND cùng nhau.

Tôi muốn thêm khả năng tạo câu lệnh OR. Tôi có thể dễ dàng thêm OR trong trường hợp các cột giống nhau, nhưng những câu lệnh logic phức tạp như

((A OR B HOẶC C) AND (D OR E)) HOẶC (F VÀ G)?

Làm cách nào để tôi có thể cho phép người dùng tạo các tuyên bố như vậy theo cách thân thiện với người dùng?

EDIT: Để chỉ định, thân thiện với người dùng cho đối tượng chung. Hiện tại, tôi làm việc với các nhà phát triển mà đôi khi mã hóa các truy vấn SQL cho một khách hàng không có kỹ thuật cần thông tin cụ thể từ cơ sở dữ liệu của chúng tôi. Mục tiêu là ứng dụng web này sẽ loại bỏ sự cần thiết phải chúng tôi viết mã cho họ bằng cách cung cấp cho khách hàng một công cụ dễ sử dụng để tự thực hiện.

EDIT2: Hiện tại ứng dụng không được người dùng cuối sử dụng. Dữ liệu duy nhất tôi sử dụng là các truy vấn SQL viết tay trước đây và do đó là loại truy vấn mà khách hàng yêu cầu. Vì tôi có thể đơn giản hóa nó (ví dụ: hạn chế khả năng tạo truy vấn cho các loại truy vấn mà họ có xu hướng yêu cầu), nhưng tôi muốn xem liệu có ai có kinh nghiệm giao tiếp logic logic đơn giản và hoàn toàn trong GUI.

Cảm ơn bạn đã dành thời gian.

+1

Bằng cách "thân thiện" Ý anh là "người dùng thân thiện cho một đối tượng chung "hoặc" thân thiện với người dùng đối với những người ít có chút quen thuộc với logic boolean "? –

+0

Xin lỗi, một câu hỏi nữa: là người dùng cuối đã sử dụng lặp lại ứng dụng hiện tại chưa? Chỉ cần tự hỏi nếu họ đã được đào tạo để nhận ra và sử dụng hiệu quả các cột/nhà điều hành/giá trị bộ ba của dropdowns. –

Trả lời

5

Khi bạn cần để xử lý ((A or B) and C) or (D or E or F), bạn đang làm việc với một cấu trúc dữ liệu cây như thế nào. Theo kinh nghiệm của tôi, không có cách nào dễ dàng để đại diện cho cây quyết định cho người dùng theo cách "đẹp" hoặc "trực quan". Khó gấp đôi của nó trong ASP.NET webforms.

Tuy nhiên, một cách tiếp cận được thử nghiệm và thực sự là như sau: hộp văn bản đơn chấp nhận mệnh đề where.Tôi tin tưởng, cách tiếp cận đơn đầu vào thực sự là giao diện người dùng đơn giản và trực quan nhất, và nó cũng có lợi thế * cho phép nhập/sửa đổi nhanh các bộ lọc truy vấn.

** Một lợi thế khác, từ phía kỹ thuật, là có thể viết lexer/parser của riêng bạn và AST. Bạn có thường xuyên làm điều đó trong ứng dụng crud cơ bản không:) *

Bạn sẽ được đào tạo người dùng cách sử dụng công cụ truy vấn đặc biệt, bạn cũng có thể huấn luyện họ gõ (account.Balance < -2000 and account.Type == 'Checking') OR (account.Number = 123456) trả về chính xác những gì nó nói nó trả về.

Nếu bạn sử dụng phương pháp này, hãy cung cấp cho người dùng danh sách thả xuống các cột có sẵn, để nhấp đúp vào mục sẽ chèn mục vào hộp văn bản tại vị trí con trỏ.

+0

Tôi muốn đồng ý về nguyên tắc giao diện người dùng, nhưng đầu vào 'WHERE' tùy ý giống như một cơn ác mộng về bảo mật. Có cách nào đáng tin cậy để lọc loại đầu vào đó không? –

+2

bạn có thể thử vệ sinh như loại bỏ ';' và những điều ác khác .. nhưng nói với khách hàng để tìm hiểu SQL Tôi không nghĩ là một giải pháp tốt – Earlz

+1

Nó không thực sự nói cho khách hàng để tìm hiểu SQL, chỉ cần nói cho khách hàng để tìm hiểu làm thế nào để thể hiện các yêu cầu này dưới dạng văn bản có thể đơn giản hơn so với một hình ảnh dựa trên trình đơn thả xuống. –

1

Mac OS X cung cấp các tiện ích GUI rất đẹp để thực hiện chính xác loại điều này. Bạn có thể lập mô hình GUI của mình sau loại bố cục/tương tác này.

+0

Nó không rõ ràng từ ảnh chụp màn hình rằng có bất kỳ cách nào để làm những gì OP yêu cầu (logic boolean phức tạp liên quan đến nhiều tiêu chí), và nếu OP không phát triển trên Mac, ảnh chụp màn hình đó là tất cả những gì anh ta có. –

+0

Giải thích của tôi về câu hỏi là ông đang tìm kiếm một cách để trình bày một giao diện người dùng rõ ràng cho phép người dùng, nhiều hơn hoặc ít hơn, viết danh sách các câu lệnh logic boolean. Tôi không nghĩ anh ấy hỏi về cách viết mã mà thực sự sẽ giải thích ý kiến ​​của người dùng. –

+1

Xin lỗi, tôi sẽ diễn giải lại nhận xét của tôi dưới dạng câu hỏi: làm thế nào để nhập một cái gì đó như "((A HOẶC B HOẶC C) VÀ (D HOẶC E)) HOẶC (F VÀ G)" (trích dẫn từ câu hỏi của OP) giao diện người dùng được chia sẻ ở trên? –

0

Tùy chọn khác là giao diện trình tạo truy vấn SQL Server Management Studio - một số hàng và cột, trong đó các hàng biểu diễn AND và các cột OR (hoặc ngược lại, tôi không nhớ).

Bạn có thể cập nhật thời gian thực của truy vấn kết quả để giúp người dùng (giống như SQL Server cập nhật SQL kết quả).

1

Rất khó để thể hiện ngay cả trong ứng dụng WinForms.

Những gì bạn cần làm là triển khai khái niệm nhóm điều kiện, bao gồm một hoặc nhiều câu lệnh và toán tử có điều kiện.

Việc thực hiện tốt nhất điều này tôi thấy là từ bộ lọc máy chủ GameSpy - Tôi chỉ cố gắng tìm kiếm ảnh chụp màn hình, nhưng tôi đã bỏ trống (chương trình đó vẫn tồn tại?). Từ những gì tôi nhớ lại, họ đã làm một cái gì đó như thế này:

(
    Condition 1 
) OPERATOR 
(
    Condition 2 
) OPERATOR 
(
    (
     Condition 3 
    ) OPERATOR 
    (
     Condition 4 
    ) 
)
1

Khi tôi thấy một vấn đề như thế này, tôi không thể không suy nghĩ về việc triển khai nó như một chồng, tương tự như cách RPN sẽ giải quyết vấn đề này.

Vấn đề ở đây là nó không có vẻ quá trực quan giao diện người dùng

mẫu: ([Button] < một hộp văn bản để người dùng nhập vào > {list}

Value: < > [Đẩy] [Và] [Hoặc]

stack {

} (HP RPN máy tính đặt ngăn xếp trên khu vực chỉnh sửa)

Vì vậy, nếu tôi muốn viết biểu thức ((A và B) hoặc (C và D)), tôi sẽ làm điều này: A [push] (ngăn xếp sẽ chứa "A") B [đẩy] (ngăn xếp sẽ chứa "B", "A") [và] (ngăn xếp sẽ chứa "(A và B)") C [đẩy] (ngăn xếp sẽ chứa "C", "(A và B) ") D [đẩy] (ngăn xếp sẽ chứa" D "," C "," (A và B) ") [và] (ngăn xếp sẽ chứa" (C và D) "," (A và B) ") [hoặc] (ngăn xếp sẽ chứa" ((A và B) hoặc (C và D) ")

nếu bạn muốn thêm các toán tử khác và không quá nhiều, bạn có thể thêm nút hoặc làm cho một hộp riêng biệt cho các nhà điều hành

Value: < > [Đẩy] hành < > [Combine]

Nếu bạn muốn hỗ trợ các nhà khai thác unary, bạn cần phải theo dõi xem đó là một tiền tố hoặc toán tử postfix, hoặc chỉ giả định tiền tố (toán tử đơn nguyên boolean "not" thường là tiền tố). Các toán tử ternary thường có hai trình thiết kế infix, vì vậy sẽ phức tạp hơn nếu bạn muốn hỗ trợ chúng. Một số toán tử nhị phân (và n-ary) có tiền tố, infix và hậu tố thành phần "CallMethod (A, B)" Vì vậy, nó thực sự đi xuống đến mức độ phức tạp mà bạn muốn làm cho nó.

Chỉ một ý tưởng.

12

Apple dường như đã tìm thấy cách thiết kế GUI cho biểu thức boolean lồng nhau: xem câu trả lời được chấp nhận trên UX.stackexchange.

enter image description here

2

Thực sự tôi không nhìn thấy giá trị kinh doanh bằng văn bản tùy chỉnh "ở đâu", "chọn", "từ" hoặc ra lệnh cho bất kỳ SQL khác proxy. Đặc biệt, trong bối cảnh cụ thể này (truy cập DB và tùy chỉnh trên truy vấn bay) khách hàng sẽ mở ra các cổng an ninh của địa ngục.

Cho phép "núm vú giả" (giả sử tôi không có khả năng sử dụng các công cụ SQL thông thường) soạn truy vấn "trực quan" là một thảm họa đang chờ xảy ra. Tôi đoán câu lạc bộ thông tin thẻ tín dụng của BJ bức tượng bán thân của năm 2003 hoặc 2004 là khá gần với điều này trong tinh thần. Tôi đoán (và nó chỉ là một dự đoán !!!) một số ông chủ tiếp thị lớn nói "Chúng tôi sẽ lưu thông tin thẻ tín dụng sọc để chúng tôi có thể tận dụng thông tin đó sau." "Bạn có muốn chỉ thông tin công khai có sẵn trong một bảng và PII thống kê bị khóa" - hỏi nhà phát triển ..... "Không, chúng tôi chưa biết cách chúng tôi muốn sử dụng thông tin đó, phát triển cho chúng tôi một công cụ để truy vấn nó một CÁCH TÙY CHỈNH ..... "là bước đệm đầu tiên trên con đường dẫn đến thảm họa. :(

Trong khi đó, chắc chắn có những nơi cần giao diện người dùng để soạn thảo/phân tích biểu thức (công cụ phân tích chính sách bảo mật, nghiên cứu đại số boolean/chuyển đổi, v.v.) :)), nhưng nếu nó được tạo ra, tôi muốn hình dung nó có khả năng:

  1. Phân tích các biểu thức (nên tầm thường như người ta có thể xây dựng cây phân tích cú pháp như dùng thêm khối biểu piece by piece)
  2. Hiển thị các biểu thức trong một hình thức cây phân tích cú pháp (mà nên được vui vẻ vẽ nó).
  3. Hiện đúng/table sai cho BF trình bày bởi các biểu hiện
  4. Draw BF hypercube (đặc biệt có giá trị cho các chức năng "đơn điệu giống như")
  5. Tạo một bản đồ Karnaugh với liên kết topo (chúc may mắn với các biểu thức chiều cao mặc dù)
  6. Tự động tạo biểu đồ Venn cho biểu thức.
  7. Làm nổi bật các biến không cần thiết hoặc "khối biểu thức".
  8. Sử dụng phương pháp giảm thiểu biểu thức boolean của phương pháp McCluskey hoặc Petrick.
Các vấn đề liên quan