这是一个好的设计吗?

时间:2010-03-19 14:38:48

标签: sql oop

我想知道您对我们计划的这一部分的看法:

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

合作伙伴致电我们,让所有露营地都靠近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年以来,从一开始就在这里的唯一开发人员开始了解公共和私人之间的差异。
2)我不喜欢SP因为:我们可以覆盖,并且t-sql使用起来不是那么有趣:)

那你觉得怎么样?清楚吗 ?你有任何我应该关注的模式吗?

如果不清楚,请询问

1 个答案:

答案 0 :(得分:3)

看起来相当清楚,并且可能会奏效。它与查询对象模式略有不同(参见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工具将会稍微不那么艰难。