一、 某系统需要建立人与人之间的关系网络, 关系根据其紧密程度分为3种类型(1-普通关系,2-好友关系,3-密友关系),简单存储表结构如下:
create table people (
    id int(11) not null,
    name varchar(100) not null,
    locked int(3) not null default 0,
    primary key (id)
); create table people_relation (
   from_id int(11) not null,
   to_id int(11) not null,
   relation int(3) not null,
   primary key (from_id, to_id)
);说明:
1、表中数据只存储单向关系,如张三和李四是好朋友,则from_id为张三,to_id为李四,relation为2-好友关系,不存储from_id为李四,to_id为张三的反向记录。
2、某人的直接关系是指将其做为from_id找到的to_id和将其作为to_id找到的from_id。
3、间接关系只限一级,如张三和李四是好朋友,李四和王五是密友,赵六和李四是普通朋友,则王五和赵六属于张三的间接关系,若王五和钱七是好朋友,则钱七不属于张三的间接关系,因为其已经超出了间接关系的级数限制。
4、两人之间的关系权重按如下公式计算:直接关系W =R ,间接关系W = W * W ,其中R 表示a和b的关系紧密程度,上标d表示直接关系,i表示间接关系。如:张三有好友李四,则张三和李四的直接关系权重为2(2-好友关系),李四有密友王五,则张三和王五的间接关系权重为2 * 3 = 6。
5、直接关系网的广度按照如下公式计算:E =  ( W )或E =  ( R * C ),k表示a的直接关系网里的人员序号,C 表示与a存在关系m的人的数量。如:张三有1个密友,3个好友,李四有2个密友,2个好友,则张三的关系网广度为 3 + 2 +2 +2 = 9 或1 * 3 + 3 * 2 = 9,李四的关系网广度为3 + 3 + 2 + 2 = 10或2 * 3 + 2 * 2 = 10,那么李四的关系网广度排序高于张三。
6、假定系统已经在com.longspur.exam.dao包下提供如下接口和实现来进行数据库访问。public interface IDAO<T> {
    /**
     * Execute sql using given parameters and return list of entity
     */
    List<T> find(String sql, Object[] paras);
} public class DefaultDAO<T> implements IDAO<T> {
    @Override
    public List<T> find(String sql, Object[] paras) {
        // TODO ...
        return new ArrayList<T>(0);
    }
}public class DAOFactory {
    private static DAOFactory instance = new DAOFactory();
    /**
     * Return the singleton instance of DAOFactory
     */
    public static DAOFactory getInstance() {
        return instance;
    }
    
    private DAOFactory() {
    }
    /**
     * Return DAO instance for given template class
     */
    public <T> IDAO<T> getDAO(T clz) {
        // … 
    }
}
测试题目:
1、请设计接口和相关类并编写出主要代码实现下述功能a或b, 假定数据库访问已经可以通过DAOFactory获取的IDAO实例进行实现,其可直接返回entity对象集合,每个entity的数据会根据与jdbc结果集字段名相对应的规则自动进行填充,代码里只需传入sql和参数即可。
a 找出某人的直接关系中关系网最广的前十人(按照直接关系网广度排序)b 找出和某人有间接关系的前十人(按照间接关系权重排序)
2、假设人员具有锁定与正常两种状态(locked为1表示锁定,0表示正常),如果系统要求对于锁定状态的人员不能进行关系网查询,并需要告知调用者该人员被锁定不能查询,请调整设计接口或实现来满足该要求。3、假设系统需要提供批量获取用户关系网数据的功能,拟通过对前述获取单个人员关系网实现进行复用,请调整设计或实现来满足该要求。4、如果批量用户的最大数据量会达到1W,并且需要最慢在2S内取到结果,对于在规定时间未处理完的用户需要立即停止处理并忽略其结果,只返回已经处理完毕的,同时系统还需要考虑尽可能提高其处理效率(如使用多线程并行处理等),请调整设计和实现来满足该要求。二、某系统使用cache来提高效率,cache的读写方法已经封装到CacheUtils类中。现有大量的读取user数据的请求,且大部分是重复读取,为了减轻数据库压力并提高系统效率,系统拟使用该cache,请设计相应结构并简要实现。说明:
1、 DAOUtils提供了执行sql并组装entity数据的功能,entity组装按照属性名与jdbc返回结果集字段名对应的原则自动进行。
2、 假定系统已经在com.longspur.exam.entity包下为用户提供如下Entitypublic class User {
    private int id;
    private String name;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
3、 假定系统已经在com.longspur.exam.dao包下提供如下接口和实现来进行数据库访问
public class DAOUtils {
    /**
     * Execute sql using given parameters and return list of given type of entity 
     */
    public static <T> List<T> find(String sql, Object[] paras, T clz) {
        // ....
        return new ArrayList<T>();
    }
}public interface IUserDAO {
    /**
     * Return user entity list for given user ids
     */
    List<User> find(int[] userIds);
}4、 假定系统已经在com.longspur.exam.cache包下为用户提供访问cache的工具类
public class CacheUtils {
    /**
     * Look up data from cache by given key, if it does not exist, then return null
     */
    public static Object get(String key) {
        // TODO ...
        return null;
    }
    /**
     * Set data to cache using given key
     */
    public static void set(String key, Object data) {
        // TODO ...
    }
}