2009-12-03 24 views
16

hiện tại chúng tôi đang phát triển ứng dụng trong đó chúng tôi sử dụng bảng cơ sở dữ liệu để lưu trữ cài đặt nền tảng, như kích thước tệp tối đa, số người dùng tối đa, email hỗ trợ, v.v.có tốt hơn khi lưu trữ cấu hình nền tảng trong cơ sở dữ liệu hoặc tệp không?

điều đó có nghĩa là mỗi lần chúng tôi thêm cài đặt nền tảng thêm một cột vào bảng này.

trong các dự án trước đây của tôi, tôi được sử dụng để lưu trữ thông tin đó trong hồ sơ.

phương pháp tiếp cận tốt hơn/nhanh hơn là gì?

ps, ​​tôi gần như chắc chắn ai đó đã có câu hỏi như vậy, nhưng tôi dường như không thể tìm thấy nó

+2

Nếu bạn cần thêm cột mới nếu loại mới của bất kỳ thứ gì bạn đang lưu trữ xuất hiện, giản đồ của bạn có lẽ không được chuẩn hóa. – EricSchaefer

Trả lời

7

Nó thực sự phụ thuộc vào ứng dụng của bạn.

Lưu trữ các thiết lập trong cơ sở dữ liệu có nhiều ưu điểm:

  1. An ninh - người dùng có thể dễ dàng thay đổi các thiết lập trong file hoặc ghi đè lên nội dung.
  2. Để phân phối - các cài đặt tương tự có thể được cập nhật và tải lên bất kỳ máy nào trên mạng.

Nhược điểm:

  1. Dựa vào kết nối cơ sở dữ liệu
  2. Overhead khi đọc từ cơ sở dữ liệu

Lưu trữ trong lợi thế file:

  1. nhanh và dễ dàng để đọc và sửa đổi .

Nhược điểm:

  1. vấn đề an ninh như đã đề cập ở trên.
  2. Có thể cần mã hóa dữ liệu nhạy cảm.
  3. Việc tạo phiên bản rất khó, vì bạn phải tạo các tệp riêng biệt cho các phiên bản khác nhau.

nó có nghĩa là mỗi lần chúng ta thêm một thiết lập nền tảng chúng ta phải thêm một cột vào bảng này - tùy thuộc vào những gì cơ sở dữ liệu bạn đang sử dụng, nhưng bạn có thể lưu trữ toàn bộ các thiết lập như XML (SQL server cho phép này) trong bảng, vì vậy bạn không cần phải thay đổi lược đồ bảng mỗi khi thêm một cài đặt; tất cả những gì bạn cần làm là sửa đổi XML, thêm các phần tử vào nó hoặc loại bỏ nó.

nhưng cuối cùng, bạn phải tự quyết định, không tốt hơn hoặc tệ hơn cho mọi người.

+7

-1. Tôi nghĩ tỷ lệ tín hiệu nhiễu là khá thấp ở đây. Nhiều điểm chỉ không có ý nghĩa. Giống như "overhead khi đọc từ cơ sở dữ liệu". Những gì trên không? Một vài ms? Đọc cấu hình một lần. Và "dựa vào kết nối cơ sở dữ liệu". Vì vậy, phần còn lại của ứng dụng. Sau đó, bạn đang nói lưu trữ một "tệp" XML trong cơ sở dữ liệu? Lợi thế là gì? Và phiên bản tập tin. Phiên bản tệp dễ dàng, bất kỳ hệ thống kiểm soát phiên bản nào cũng làm được. Phiên bản cơ sở dữ liệu là một vấn đề khó khăn hơn. – z5h

+2

Sry, Hãy để tôi làm rõ một chút: 1. Ứng dụng không phải dựa vào bất kỳ kết nối cơ sở dữ liệu nào, nó chỉ là một tùy chọn như được đề cập trong câu hỏi. 2. XML cho phép thông tin phân cấp được đóng gói, thay vì chỉ bàn phím phẳng, giá trị cặp. 3. Versioning - Tôi đoán bạn là đúng, dễ dàng hoặc khó khăn thực sự phụ thuộc vào cách bạn thiết lập nó quá, vì vậy tôi sẽ đồng ý về bạn. 4. Overhead - Đọc cấu hình một lần, có, tôi giả sử, nhưng bạn cũng có thể muốn cập nhật và tải lại đôi khi để cập nhật hoặc nhận cấu hình cập nhật; như tôi đã nói, nó phụ thuộc vào toàn bộ kiến ​​trúc. – K2so

+4

Đừng đọc cấu hình một lần! Không cho phép thay đổi thời gian chạy? – Xailor

7

Tại sao mỗi cột mới lại có thời gian? Tại sao không chỉ có 2 cột: NAME và VALUE.

Việc chúng tôi làm là đặt mặc định trong một tệp, sau đó ghi đè các giá trị mặc định đó trong cơ sở dữ liệu khi cần, mỗi lần triển khai.

Ngoài ra, về tốc độ, chúng tôi lưu trữ cấu hình (với khả năng kích hoạt tải lại). Làm cho không có ý nghĩa để đọc lại cấu hình mỗi khi bạn cần một tài sản từ nó. Vì vậy, về tốc độ, nó không thực sự quan trọng. Bạn làm điều đó một lần.

+0

Bài đăng cuối cùng là cấu hình giống như với phần thực hiện. – wener

+1

Tôi biết điều này thực sự cũ, nhưng tôi thấy điều này thực sự hữu ích. Tôi đã tự hỏi mình một câu hỏi ... làm cách nào để cài đặt ứng dụng của tôi dễ dàng truy cập được với quản trị viên thông qua GUI VÀ không viết một bảng chỉ chứa một hàng có thể thay đổi liên tục? Đây là câu trả lời hoàn hảo, và cũng giúp tránh buộc các giá trị cột 'NULL' cho các cài đặt không sử dụng. – Allenph

31

Chúng tôi lưu trữ các thiết lập cấu hình trong một bảng kiểu chìa khóa/giá trị, một cái gì đó như:

CREATE TABLE Configuration.GlobalSettings 
(
    SectionName VARCHAR(50), 
    SettingName VARCHAR(50), 
    SettingValue VARCHAR(1000), 
    SettingType TINYINT 
); 

Các SectionName & SettingName là khóa chính, chúng tôi chỉ chia chúng lên để làm cho nó dễ dàng hơn để truy vấn những gì có trong một và cho phép tải các phần riêng lẻ vào trình xử lý thay vì tải toàn bộ lô cùng một lúc. SettingValue là một chuỗi và sau đó là SettingType là một phân biệt đối xử cho chúng ta biết giá trị cài đặt sẽ được diễn giải như thế nào (ví dụ: 1 = string, 2 = bool, 3 = decimal, v.v ...).

Điều này có nghĩa là bạn không phải thay đổi cấu trúc bảng cho cài đặt mới, chỉ cần thêm cấu trúc bảng mới trong tập lệnh triển khai hoặc bất cứ nơi nào bạn thiết lập những thứ này.

Chúng tôi tìm cách cấu hình tốt hơn một tệp vì nó có nghĩa là bạn có thể dễ dàng thay đổi các giá trị cấu hình thông qua giao diện quản trị khi cần thiết, có thể thực thi logic xung quanh những gì có thể đi vào từng cài đặt. Bạn không thể làm điều đó dễ dàng như vậy với một tập tin (mặc dù, tất nhiên, nó là có thể).

+1

Xin chào, tôi biết đây là một bài đăng rất cũ, nhưng tại sao không dễ thay đổi giá trị cấu hình khi lưu cấu hình vào một tệp? Thông qua Properties/Preferences nó thực sự là rất dễ dàng để làm như vậy hoặc tôi thiếu một cái gì đó? – iliketocodeandstuff

+1

Các tệp thuộc tính là tuyệt vời nếu bạn có một hoặc hai máy chủ - khi bạn triển khai trên hàng chục máy chủ thì nó ít thú vị hơn ... –

+0

Không phải NoSQL Key/Value lưu trữ một cách tốt hơn để lưu các cài đặt như vậy ngày nay? –

8

Tôi có thể nói với bạn khi tôi quản lý một ứng dụng đặc biệt lớn ở nhiều trang web lưu giữ cấu hình trong tệp cục bộ là một nỗi đau hoàn toàn. Thông thường, các cấu hình được đọc và lưu vào bộ nhớ cache và không thể thay đổi trong thời gian chạy, những người khác có hệ thống mở rộng quy mô nơi các cấu hình cần được thay đổi nhiều lần và bị trả lại.

Cuộc sống của tôi sẽ dễ dàng hơn 10% khi triển khai cảnh quan hệ thống nếu các nhà thiết kế chỉ lưu giữ các thuộc tính hệ thống tại DB.

+5

+1 để không làm tăng đáng kể tỷ lệ phần trăm dễ dàng mà phương pháp này mang lại. – Ryall

3

Để công bằng, câu trả lời không được cắt và rõ ràng.

Các câu trả lời ở trên dường như không tính đến các ứng dụng cần được triển khai trong các môi trường khác nhau, ví dụ: dev, qa, dàn dựng, sản phẩm.

Chúng cũng không tính đến tầm quan trọng của cấu hình phiên bản, tức là biết ai đã thay đổi gì, ở đâu và khi nào.

Tất cả các khung công tác hiện đại đều cung cấp cách tìm nạp cấu hình thích hợp cho các môi trường cụ thể, thường thông qua biến môi trường.

Mỗi environnment có cấu hình riêng của mình, hãy xem xét cách symfony đưa ra file cấu hình của nó:

your-project/ 
├─ app/ 
│ ├─ ... 
│ └─ config/ 
│  ├─ config.yml 
│  ├─ config_dev.yml 
│  ├─ config_prod.yml 
│  ├─ config_test.yml 
│  ├─ parameters.yml 
│  ├─ parameters.yml.dist 
│  ├─ routing.yml 
│  ├─ routing_dev.yml 
│  └─ security.yml 
├─ ... 

Đối với những lý do này, tôi chắc chắn đa số đều thích cấu hình trong tập tin.

2 xu của tôi.

0

Tôi nghĩ như mọi người đã nói, tùy thuộc vào môi trường và yêu cầu ứng dụng của bạn. Nhưng nếu tôi phải chọn một quy tắc chung, tôi sẽ nói BOTH. Đầu tiên, bạn tạo một bảng cơ sở dữ liệu để lưu trữ tất cả các cấu hình của bạn. Điều này là tốt vì hai lý do: 1) Versioning - cho phép bạn dễ dàng theo dõi các cấu hình trước đó. 2) Quản lý - Bạn có thể tạo giao diện mà người dùng của bạn có thể truy cập để thay đổi cài đặt.

Thứ hai, bạn tạo tệp sau khi bạn lưu và xuất bản trang web để sản xuất, nó cũng sẽ lưu tất cả các cài đặt đó vào tệp sẽ dễ dàng truy cập. Trong thực tế, nếu bạn đang lập trình trong PHP cho web, tệp đó phải là tệp php với dữ liệu mảng (cặp khóa-giá trị) không cần thao tác thêm. Bởi điều này tôi có nghĩa là, không cần phải chuyển đổi yaml của bạn, hoặc json thành mảng nếu đó là sản lượng cuối cùng bạn cần phải có.

Các vấn đề liên quan