gpt4 book ai didi

sql - 这是一个好的设计吗?

转载 作者:行者123 更新时间:2023-12-04 06:56:29 26 4
gpt4 key购买 nike

我想知道您对我们计划的这一部分的看法是如何实现的:

我们的数据库中有一个露营地列表。

合作伙伴调用我们获取 GPS 位置附近的所有露营地或提供酒吧(我们称之为服务)的所有露营地。

那么我是怎么意识到的呢?

这是我们的数据库:

Campsite
- ID
- NAME
- GPS_latitude
- GPS_longitude

CampsiteServices
-Campsite_ID
-Services_ID

所以我的代码(c# 但它不相关,假设它是一种 OO 语言)看起来像这样
public class SqlCodeCampsiteFilter{
public string SqlCode;
public Dictionary<string, object> Parameters;
}

interface ISQLCampsiteFilter{
SqlCodeEngineCore CreateSQLCode();
}

public class GpsLocationFilter : ISQLCampsiteFilter{
public float? GpsLatitude;
public float? GpsLongitude;
public SqlCodeEngineCore CreateSQLCode()
{
--return an sql code to filter on the gps location like dbo.getDistance(@gpsLat,@gpsLong,campsite.GPS_latitude,campsite.GPS_longitude) with the parameters
}
}
public class ServiceFilter : : ISQLCampsiteFilter{
public int[] RequiredServicesID;
public SqlCodeEngineCore CreateSQLCode()
{
--return an sql code to filter on the services "where ID IN (select CampsiteServices.Service_ID FROm CampsiteServices WHERE Service_ID in ...)
}
}

所以在我的网络服务代码中:
List<ISQLFilterEngineCore> filters = new List<ISQLFilterEngineCore>();
if(gps_latitude.hasvalue && gps_longitude.hasvalue){
filters.Add (new GpsLocationFilter (gps_latitude.value,gps_longitude.value));
}
if(required_services_id != null){
filters.Add (new ServiceFilter (required_services_id ));
}
string sql = "SELECT ID,NAME FROM campsite where 1=1"
foreach(ISQLFilterEngineCore aFilter in filters){
SqlCodeCampsiteFilter code = aFilter.CreateSQLCode();
sql += code.SqlCode;
mySqlCommand.AddParameters(code.Parameters);//add all the parameters to the sql command
}
return mySqlCommand.GetResults();

1)我不使用 ORM 的原因很简单,因为该系统已经存在 10 年了,并且从一开始就在这里的唯一开发人员开始了解公共(public)和私有(private)之间的区别。
2)我不喜欢 SP,因为:我们可以做覆盖,而 t-sql 用起来不太好笑:)

所以你怎么看 ?清楚吗 ?你有什么我应该看看的模式吗?

如果有什么不清楚的请询问

最佳答案

看起来相当清晰,并且可能会起作用。它与查询对象模式略有不同(参见 Fowler, Martin。企业架构模式。Addison Wesley,2003),但相差不大。

这有一个名为 Query 的类,它有一个 Criterion 对象的集合。

Criterion 对象将具有要过滤的运算符、字段和过滤器值(在 Java 中,抱歉):

Class FloatCriterion implements Criterion {
String _operator; // = "="
String _fieldName; // = "GPS_latitude"
Float _value; // = 43.21

String getSql(){
// build the where criteria
}
Param getValue(){
// return the param value
}
}

Query 对象将具有您的基本查询:
Class CampsiteQuery implements Query {
String _baseQuery = "SELECT ID,NAME FROM campsite where 1=1"
Collection<Criteria> _criteria;

void addCriterion(Criterion crit) {
_criteria.add(crit);
}

String buildSql{
// concat _baseQuery with each Criterion.getSql
}

List<Param> getParams {
// build list of params from criteria
}

List<Campsite> get Results {

}

}

从那里应该有一个服务可以接受查询并与数据库进行对话。

这将使您处于一个位置,当您到达那个点时,迁移到 ORM 工具将变得不那么困难。

关于sql - 这是一个好的设计吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2478087/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com