我的数据库架构是
INTEGER id
TIME_STAMP last_updated // indexed
VARCHAR url // indexed
// Place attributes
VARCHAR name // indexed
VARCHAR address // indexed
VARCHAR phone // indexed
INTEGER score
在姓名、地址和电话字段中,其中一个必须为非空,另外两个必须为空。
有效示例:
{name="Pizza Hut", address=null, phone=null, score=40}
无效示例:
{name="Pizza Hut", address="some address", phone=null, score=40}
我正在尝试编写这个函数。
// return a map/dictionary of String keys and Integer scores of latest data in DB that matches given url, and is not older than last_updated.
// example: {name=40, address=50, phone=66}
public Map getPlaceAnalysis(String name_, String address_, String phone_, String url, DateTime last_updated_);
缩放假设:
- 这个函数会被非常频繁地调用。
- 数据库有数百万行
- 姓名、电话、地址可能不是我唯一的字段。我可能对一个地方有 20 多个属性。
有两种方法:
3(或关于存储在数据库中的地方的属性数量)查询:
SELECT score FROM db_name WHERE name=name_ AND url = url_ AND last_updated > last_updated_ SELECT score FROM db_name WHERE phone=phone_ AND url = url_ AND last_updated > last_updated_ SELECT score FROM db_name WHERE address=address_ AND url = url_ AND last_updated > last_updated_
每次查询后,我可以选择最新的行并将分数写入我的地图/字典中,以便为适当的键返回。
1个查询:
SELECT name, phone, address, score FROM db_name WHERE (name=name_ OR phone=phone_ OR address=address_ ) AND url = url_ AND last_updated > last_updated_
然后,我遍历查询结果并找出姓名、电话和地址的最新行,并返回适当的地图/字典。
我采取哪种方法重要吗?我猜第二个更好,但我对数据库的经验很少。抱歉,如果有任何解释不清楚。我想这是一个很常见的问题,但无法弄清楚如何搜索这个问题。