2012-03-21 47 views
8

Cách thực hành tốt nhất để lưu trữ dữ liệu trong cơ sở dữ liệu chỉ bao giờ yêu cầu một mục nhập duy nhất. Một ví dụ sẽ là dữ liệu cấu hình liên quan đến toàn bộ ứng dụng/trang web. Việc tạo bảng cho mục này chỉ có một mục duy nhất có phổ biến không?Cách tốt nhất để lưu trữ dữ liệu không lặp lại một lần vào cơ sở dữ liệu là gì?

Tôi hỏi trong ngữ cảnh của cơ sở dữ liệu MongoDB mặc dù tôi nghĩ rằng câu hỏi này cũng hợp lệ đối với cơ sở dữ liệu SQL.

+1

wouldn Đây có phải là tốt hơn để được xử lý bởi các lớp ứng dụng? Nó có thể chỉ là một tập tin văn bản duy nhất, nơi bạn có thể đọc/ghi cặp giá trị chính. Có lý do cụ thể nào để sử dụng cơ sở dữ liệu không? – cctan

Trả lời

0

Đối với cơ sở dữ liệu MongoDB, tôi thường chỉ tạo một "bảng" mới, nhưng đối với cơ sở dữ liệu SQL đòi hỏi nhiều hơn (đặc biệt khi những người khác cũng làm việc trên cùng cơ sở dữ liệu; SQL không dễ dùng) , bạn có thể muốn cẩn thận hơn một chút với nó.

1

Nếu bạn đang sử dụng SQL DB, có thể bạn sẽ có các cột như tên khóa và giá trị và mỗi thuộc tính sẽ được lưu dưới dạng hàng. Trong MongoDB, bạn có thể lưu trữ tất cả cấu hình có liên quan dưới dạng một tài liệu JSON

+0

Tất cả các quyền tôi giả sử nếu tất cả các giá trị của bạn là cùng một loại hoặc bạn không nhớ nhập chuyển đổi ... –

5

Ví dụ về bảng phụ thường được tìm thấy trong cơ sở dữ liệu sẽ được gọi là Constants và có thể chứa các giá trị pi đó, ý tưởng bắt đầu là tất cả các ứng dụng sử dụng cơ sở dữ liệu được yêu cầu sử dụng cùng một tỷ lệ và độ chính xác. Trong SQL chuẩn, để đảm bảo chúng tối đa một hàng, ví dụ: (from Joe Celko):

CREATE TABLE Constants 
(
lock CHAR(1) DEFAULT 'X' NOT NULL PRIMARY KEY, 
CHECK (lock = 'X'), 
pi FLOAT DEFAULT 3.142592653 NOT NULL, 
e FLOAT DEFAULT 2.71828182 NOT NULL, 
phi FLOAT DEFAULT 1.6180339887 NOT NULL, 
... 
); 

Vì mySQL không hỗ trợ CHECK chế sau đó kích hoạt là cần thiết để đạt được như vậy.

0

Tôi sử dụng bảng cấu hình có tên (config_name) và một giá trị (config_value). Tôi thậm chí còn thêm một trường trợ giúp để người dùng có thể xem cặp tên/giá trị được sử dụng cho mục đích gì hoặc nơi nó được sử dụng.

CREATE TABLE config (
    config_id bigint unsigned NOT NULL auto_increment, 
    config_name varchar(128) NOT NULL, 
    config_value text NOT NULL, 
    config_help text COMMENT 'help', 
    PRIMARY KEY (config_id), 
    UNIQUE KEY ix_config_name (config_name), 
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

Sau đó, mã php khôi phục giá trị cho khóa hoặc trả về một chuỗi trống. Giả sử $ db là một kết nối cơ sở dữ liệu mở. Tất cả các mục được buộc phải thấp hơn trường hợp.

function getConfigValue($name) { 
    $retval=''; 
    $db = $this->db; 
    $sql = 'select config_value from config where LOWER(config_name)="'.strtolower($name).'"'; 
    $result = $db->Query($sql); 
    if ($result) { 
     $row = $db->FetchAssoc($result); 
     $retval = $row['config_value']; 
    } 
    return $retval; 
} 

Tất cả mysql/php trong trường hợp này, nhưng nguyên tắc chung vẫn còn.

0

Tôi chỉ cần tạo bảng cho cấu hình, như rainecc đã nói, và sử dụng bộ nhớ cache sau đó để đưa tất cả các bảng vào bộ nhớ :) và sử dụng nó từ đó (bộ đệm). Nó sẽ là tốt nhất.

2

Một bảng sẽ ổn, không có lý do tại sao không sử dụng nó chỉ vì nó sẽ chỉ có một hàng.

Tôi vừa có ý tưởng kỳ lạ nhất (tôi sẽ không thực hiện nó nhưng vì một lý do nào đó mà tôi nghĩ về điều đó). Bạn có thể tạo một cái nhìn cứng mã hóa như thế này:

create view myConfigView 
as 
select 'myConfigvalue1' as configValue1, 'myConfigvalue2' as configValue2 

và làm select * from myConfigView :)

nhưng một lần nữa, không có lý do tại sao không sử dụng một bảng chỉ vì nó sẽ chỉ có một hàng

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