admin

它是一个好的设计吗?

sql

我想知道您对我们程序的这一部分的想法已经实现:

我们的数据库中有一个露营地清单。

合作伙伴打电话给我们,将所有露营地带到GPS位置附近,或者将所有提供酒吧的露营地(我们称为服务)提供给我们。

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

这是我们的数据库:

Campsite
- ID
- NAME
- GPS_latitude
- GPS_longitude

CampsiteServices
-Campsite_ID
-Services_ID

所以我的代码(c#,但不相关,可以说它是一种面向对象的语言)看起来像这样

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 ...)
  }
}

所以在我的webservice代码中:

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年以来就已经存在,并且自开始以来一直在这里的唯一开发人员正在开始了解公共和私有之间的区别。
2)我不喜欢SP是因为:我们可以重写,而t-sql的使用并不那么有趣:)

所以你怎么看 ?清楚吗 ?您有什么图案值得一看吗?

如果不清楚,请询问


阅读 130

收藏
2021-06-07

共1个答案

admin

看起来相当清晰,可能会起作用。它与查询对象模式(请参阅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工具上。

2021-06-07