今天我必须重新启动一个项目,由于业务(房地产)的特殊性,我将不得不为房子/公寓/机库/wahetever 存放一张桌子。但是一行可以包含 1000 多个标准,因此,列(它有游泳池?壁炉?直升机停机坪,地下掩体?等等......
但是你可以猜到,这些行中的大多数都等于 null(谁家里有直升机停机坪或掩体?很少有人......)
因此,我想知道您有什么想法可以最有效地存储它?与哪个数据库?磁盘空间、速度、内存使用量等......而且还可以让编码器尽可能轻松地取回数据(例如,可以选择拆分为多个表,但可以选择获取数据)这样的架构很烦人)
另外,我更愿意保留一个关系数据库(mySQL、postgres ...),但我愿意接受建议。
谢谢你的建议!
小智 5
但是一行可以包含 1000 多个条件
不,您是在有缺陷的关系模型上预测您的数据设计。把车放在马之前。尾巴摇着狗。
我认为您的意思是单个实体可以有 1000 个属性。在这种情况下,尤其是当大多数为空时,最好的解决方案通常是实体-属性-值。大概有一些属性总是会被填充,例如
CREATE TABLE house (
id INTEGER NOT NULL AUTOINCREMENT,
owner_id INTEGER NOT NULL,
address ....
Run Code Online (Sandbox Code Playgroud)
然后只存储在这样的表中相关的属性......
CREATE TABLE house_attribute (
house_id INTEGER NOT NULL,
attribute VARCHAR(30),
description VARCHAR(128)
PRIMARY KEY (house_id, attribute)
)
Run Code Online (Sandbox Code Playgroud)
您迟早会遇到的问题是,当您只有带“地下室”的房子时,有人会想要带“地窖”的房子。部分原因是用户界面问题,但它看起来也像是使用 ENUM 数据类型的情况。但是,当您有很多 ENUM 数据类型并且条目数在创建后发生变化时,管理它们可能会很棘手。因此,您确实应该为 house_attributes.attribute 提供一个可能值列表作为一个单独的表,并在 house_attribute.attribute 上设置外键约束。
查询数据比使用大量列稍微复杂一些 - 但在一组属性没有完全匹配的情况下确实提供了一些灵活性:
SELECT house.id, house.address, GROUP_CONCAT(house_attribute.attribute)
FROM house
INNER JOIN house_attributes
ON house.id=house_attribute.house_id
WHERE house_attribute.attribute IN ('helipad', 'bunker', 'swimming pool'....)
GROUP BY house.id, house.address
ORDER BY COUNT(*) DESC;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
31 次 |
最近记录: |