我有2个表:文档和类别,包含多对多关系。此外,该关系还有一个名为 weight 的属性。 我还有相应的类,文档表示如下:
public class Document {
private Integer id; // Id from DB, 0 if new object
private String name;
private String url;
private Date dateCreated;
private List<Category> categories;
// getters & setters...
}
现在我有两个问题 - 特别是最佳实践问题。 我想从数据库(MySQL)中检索数据并构建我的对象。我使用类似的SELECT语句:
SELECT doc.*, GROUP_CONCAT(cat.CategoryID SEPARATOR ',') AS CategoryGrp FROM document doc
LEFT JOIN doc_category dc ON doc.Doc_ID = dc.DC_DocID
LEFT JOIN category cat ON dc.DC_CategoryID = cat.CategoryID
GROUP BY doc.Doc_ID
在结果集中, rs.getString(5) - &gt; CategoryGrp 将包含相关类别的ID。现在,我如何通过链接其类别所需的类来继续构建我的对象文档。
我倾向于在表类别上执行新的 SELECT 请求,以便在循环中获取其他详细信息(例如类别名称),同时仍然在第一个ResultSet上。 这是一个好习惯吗?是不是有“推荐”的方式?
我的第二个问题是关于联结表中的属性 weight 。我应该在哪个对象中记录其值?我猜这是分类但不太确定,因为分类对象本身不能有重量 ......
希望我足够清楚。 感谢
答案 0 :(得分:0)
回答第1个问题: 2种方式:一个sql或者你建议使用2个sql。 (检索文档和每个cat id执行sql以检索cat属性) 我认为这更好: 获取具有不同猫及其属性的所有文档。循环它并将doc与前一个进行比较。如果不同,那么您有一个新的doc对象。循环中的每一行都是一个不同的猫对象。
doc1 cat1
doc1 cat2
doc1 cat3
doc2 cat4
doc3 cat5
doc3 cat6
...
回答第二个问题: 我认为你应该考虑这个问题:体重与医生或猫的关系更重要吗?另一方面,你不能在1个doc上有多个权重,所以我的猜测是添加到cat(因为这是一对一的关系。
答案 1 :(得分:0)
RDBMS中的多对多关系始终由至少3个表完成。所以你需要一个第三个表,它将包含前两个的ID,所有的SELECT-s都会通过这个第三个表。