Node.js图库的数据库解决方案
我正在使用Node.js开发一个基于Web的个人飞机照片库,向朋友/同事/等展示我的照片。服务器最多可托管数百或1-2千张这些照片(作为静态文件),而其附带的数据将存储在数据库中。
该网站不应产生过多流量(一次只能访问1-2次)。其主要功能是复杂的搜索“引擎”,能够过滤和订购飞机制造商,飞机类型,飞机注册,航空公司,拍摄照片的机场,照片日期以及许多其他方面的照片。
我已经开发了一个关系模型来实现这些目标,并在MySQL数据库中实现:
+-------+
| Photo |
+-------+
N | | N
+----------------+ +--------------+
1 | | 1
+------------------------+ +--------------------------+
|Aircraft | e.g. "G-CIVL"| | Airport | e.g. "Heathrow"|
+------------------------+ +--------------------------+
N | | N
1 | | 1
+-----------------------+ +-----------------------+
| Model | e.g. "747-400"| | City | e.g. "London" |
+-----------------------+ +-----------------------+
N | | N
1 | | 1
+-------------------------+ +--------------------------------+
|Model_family | e.g. "747"| | Country | e.g. "United Kingdom"|
+-------------------------+ +--------------------------------+
N |
1 |
+----------------------------+
|Manufacturer | e.g. "Boeing"|
+----------------------------+
每张照片条目都包含有关在(机场 - 城市 - 国家“分支机构”)拍摄的位置以及照片中显示的飞机(飞机 - 型号 - 型号 - 家庭 - 制造商“分支”)的信息。
正如我之前提到的,访问者应该能够按照这些表的任何列过滤照片,在数据库查询中需要不同的连接以用于不同的过滤选项。例子:
- 用户正在寻找在某个国家/地区拍摄的照片。返回相应图像数据的SELECT查询应该加入Photo,Airport,City和Country表。
- 用户正在按特定飞机模型过滤照片。 SELECT查询只需要连接Photo和Model表。
如果用户同时按多个(或更多)方面过滤照片,则问题会更加复杂。
因此,需要一个复杂的应用程序级SQL查询构建算法,这将考虑上述表结构。
我的问题是:
- 提到的方法(复杂的SQL字符串构建算法)是一个很好的解决问题的方法吗?
- 或者我应该将所有表连接在一起而不管用户的过滤选项如何? (似乎是更好的代码可维护性的严重性能权衡)
- 或者像MongoDB这样具有更平坦(和非规范化)模型的NoSQL解决方案是否更适合此任务?不必为不同的过滤选项设置不同的连接似乎是一个巨大的优势。存储的数据不太可能被更新或删除,因此非规范化可能不是一个严重的问题。
提前谢谢你的帮助。
回答如下:我没有使用MYSQL
那么多,但在NoSQL(Mongodb
)
你可以获得这样的数据结构,你可以根据每个参数进行搜索
[
{
"_id": 0,
"Airport": "Heathrow",
"city": "London",
"country": "United Kingdom",
"Aircraft": "G-CIVL",
"model": "747-400",
"model_family": "747",
"manufacturer": "Boeing",
"photo_url": "http://www.dummy-url/dakshdajk8sdjkhs8ds8dh8sd8sdj8s.png"
},
{
"_id": 1,
"Airport": "Heathrow",
"city": "London",
"country": "United Kingdom",
"Aircraft": "G-CIVL",
"model": "747-400",
"model_family": "747",
"manufacturer": "Boeing",
"photo_url": "http://www.dummy-url/dakshdajk8sdjkhs8ds8dh8sd8sdj8s.png"
}
]