将数据存储在只需要单个条目的数据库中的最佳做法是什么。一个例子是与整个应用程序/网站有关的配置数据。为此创建一个只有一个条目的表是常见的吗?
我在MongoDB数据库的上下文中询问,虽然我认为这个问题对SQL数据库也有效。
答案 0 :(得分:6)
数据库中常见的辅助表的示例将被称为Constants
,并且可能包含pi的这些值,开头即使用数据库的所有应用程序都需要使用相同的比例和精度。在标准SQL中,要确保它们最多只有一行,例如(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,
...
);
由于mySQL不支持CHECK
约束,因此需要触发器来实现相同的目标。
答案 1 :(得分:4)
表格没问题,没有理由不使用它只是因为它只有一行。
我只是有一个最奇怪的想法(我不会实现它,但出于某种原因,我想到了这一点)。您可以创建这样的硬编码视图:
create view myConfigView
as
select 'myConfigvalue1' as configValue1, 'myConfigvalue2' as configValue2
并且select * from myConfigView
:)
但同样,没有理由不使用表只是因为它只有一行
答案 2 :(得分:1)
如果您使用的是SQL DB,则可能会有关键名称和值等列,并且每个属性都将存储为一行。 在MongoDB中,您可以将所有相关配置存储为单个JSON文档
答案 3 :(得分:0)
对于MongoDB数据库,我通常只创建一个新的“表”,但是,对于SQL数据库,这需要更多(特别是当其他人也在同一个数据库上工作时; SQL不具有可塑性),所以,你可能想要更加小心。
答案 4 :(得分:0)
我使用带有名称(config_name)和值(config_value)的配置表。我甚至添加了一个帮助字段,以便用户可以查看名称/值对的用途或使用位置。
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;
然后跟随php代码恢复键的值,或返回一个空字符串。假设$ db是一个开放的数据库连接。所有条目都被强制为小写。
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;
}
在这个实例中所有的mysql / php,但一般原则仍然存在。
答案 5 :(得分:0)
我只是为配置创建表,就像rainecc告诉的那样,然后使用缓存将所有表都带到内存:)并从那里使用它(缓存)。这将是最好的。