我的房地产应用程序有一个数据库表,用于保存用户的查询(查询)。此表包含有关特定房地产查询的所有信息。
数据库表看起来像这样:
CREATE TABLE IF NOT EXISTS `queries` (
`id` bigint(20) NOT NULL auto_increment,
`category_id` int(10) NOT NULL,
`serial` varchar(30) NOT NULL,
`minBudget` int(11) NOT NULL,
`maxBudget` int(11) NOT NULL,
`city_id` int(10) NOT NULL,
`area_id` int(10) NOT NULL,
`locality` varchar(100) NOT NULL,
`status` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在city_id
和area_id
中,我可能会想要存储多个 ID;例如,10,12,20,50等。
我应该如何将其存储在数据库中?
我应该使用varchar
数据类型并将其保存为定义了分隔符的字符串,然后获取数组中的值吗?
答案 0 :(得分:4)
你可以这样做,但它并不是首选的解决方案。这是数据库规范化的经典权衡。
“更正确”的方法是使用表格“城市”和“区域”,并将表格“queries_cities”和“queries_areas”与多对多关联起来。
否则 - 如果城市或地区ID发生变化会怎样?您可以编写一个脚本来手动更新所有查询记录,而不是在一个地方更改单个记录。
答案 1 :(得分:1)
如果这些是另一个表的ID,请不要使用varchar。使用多对多表将它们映射在一起。
CREATE TABLE IF NOT EXIST `query_cities` (
`id` bigint(20) NOT NULL auto_increment,
`query_id` bigint(20),
`city_id` bigint(20)
)
CREATE TABLE IF NOT EXIST `query_areas` (
`id` bigint(20) NOT NULL auto_increment,
`area_id` bigint(20)
)
这比将东西填充到varchar要清晰得多 - 例如,它允许你说:
SELECT c.city_name, c.state, c.whatever FROM queries q
JOIN cities c ON (q.city_id = c.id) WHERE q.id = ?
编辑:嗯,我很蹩脚,并没有包含外键,但是你明白了。