can*_*lin 4 php mysql database preferences entity-attribute-value
有人可以推荐存储一般网站首选项的最佳做法吗?例如,如果脚本未设置一个默认页面标题,或者要在内容框中显示的特色项目数,或者系统在上载图片时应该制作的缩略图大小列表.集中这些值具有明显的好处,即允许人们轻松更改可能在许多页面上使用的首选项.
我的默认方法是将这些首选项作为属性/值对放在*gulp*EAV表中.
这个表不可能变得很大,所以我不太担心性能.我的架构的其余部分是关系型的.它确实会让一些该死的丑陋查询:
$sql = "SELECT name, value FROM preferences"
. " WHERE name = 'picture_sizes'"
. " OR name = 'num_picture_fields'"
. " OR name = 'server_path_to_http'"
. " OR name = 'picture_directory'";
$query = mysql_query($sql);
if(!$query) {
echo "Oops! ".mysql_error();
}
while($results = mysql_fetch_assoc($query)) {
$pref[$results['name']] = $results['value'];
}
Run Code Online (Sandbox Code Playgroud)
有谁能建议更好的方法?
在我的应用程序中,我使用此结构:
CREATE TABLE `general_settings` (
`setting_key` varchar(255) NOT NULL,
`setting_group` varchar(255) NOT NULL DEFAULT 'general',
`setting_label` varchar(255) DEFAULT NULL,
`setting_type` enum('text','integer','float','textarea','select','radio','checkbox') NOT NULL DEFAULT 'text',
`setting_value` text NOT NULL,
`setting_options` varchar(255) DEFAULT NULL,
`setting_weight` int(11) DEFAULT '0',
PRIMARY KEY (`setting_key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
示例数据:
mysql> select * from general_settings;
+-----------------------------+---------------+------------------------------+--------------+-------------------------------+---------------------------------------+----------------+
| setting_key | setting_group | setting_label | setting_type | setting_value | setting_options | setting_weight |
+-----------------------------+---------------+------------------------------+--------------+-------------------------------+---------------------------------------+----------------+
| website_name | website | Website Name | text | s:6:"DeenTV"; | NULL | 1 |
Run Code Online (Sandbox Code Playgroud)
我在setting_value列中存储了序列化值.我从wordpress方式获得了这个技巧来保存数据库中的设置.
setting_options列被用于select,radio或checkbox setting_type.它将包含序列化的数组值.在admin中,此值将显示为选项,因此管理员可以选择其中一个.
因为我使用CodeIgniter,所以我有一个模型可以从特定值中获取单个值setting_key,因此它非常易于使用.