【问题标题】:Trouble getting started with SubSonic开始使用 SubSonic 时遇到问题
【发布时间】:2025-12-17 13:50:01
【问题描述】:

我脑子里有一个域模型,但在构建与 SubSonic 兼容的 db 架构时遇到问题,如果您能告诉我您将如何处理这个包含 3 个实体的示例(可以是 SqlServer 还是 MySql 对我来说无关紧要)

主题- 代表教育主题(例如三角学、微积分)。 道具-名称

技术- 表示用于解决练习的技术(例如余弦定律、勾股定理) 道具-姓名,父亲主题

练习-代表某个问题。 道具- 主题、技术(仅用于解决练习的那些)、难度级别(枚举-容易、中等、困难)、答案(int)。

所以: 多对多-练习->主题,练习->技术 一对多-主题->技术。 DifficultyLevel 是一个枚举。

一旦我开始掌握文档,我一定会为文档做出贡献。

【问题讨论】:

    标签: orm activerecord subsonic domain-driven-design


    【解决方案1】:

    最简单的方法是在多对多关系之间建立桥接表。

    Table: Subject
    Columns: Subject_ID (PK)
             Name (UK)
    
    Table: Technique
    Columns: Technique_ID (PK)
             Name (UK)
             Subject_Name (FK)
    
    Table: Exercise
    Columns: Exercise_ID (PK)
             Difficulty_ID (FK)
             Question_Text
             Correct_Answer_ID (FK)
    
    Table: Difficulty
    Columns: Difficulty_ID (PK)
    
    Table: Exercise_Answer
    Columns: Answer_ID (PK)
             Exercise_ID (FK)
             Answer_Text
    
    Table: Exercise_Technique
    Columns: Exercise_Technique_ID  (PK)
             Exercise_ID (part of UK, FK)
             Technique_ID (part of UK, FK)
    
    • 受制于多种技术
    • 练习多种技巧(通过Exercise_Techniques)
    • 练习多个答案

    通过将答案分离到另一个表中并且不使用正确答案 ID 作为 int(作为第二个答案),您可以随机化答案并且通过将 answer_id 值与练习进行比较仍然知道哪个是正确答案。正确答案ID。

    【讨论】:

    • 感谢您的出色回答,我想知道桥表列的约定是 [table_name1][ID]、[table_name2][ID] 还是 [name_of_primary_key1]、[name_of_primary_key2] 和SubSonic 还使用此约定做什么?医生所说的只是“它会为你旋转一些魔法”......
    • 上述内容都不是 SubSonic 特有的。只要关系有效,SubSonic 就可以为您生成类和代码。这只是简单的数据库设计。只要您保持一致并且对其他人有些意义,您命名列的名称并不重要。我更喜欢将我的 PK 命名为 tablename_id,然后为 FK 使用相同的字段名称(除非它是唯一的,例如我在字段名称前加上前缀来指示的正确答案 ID)。
    【解决方案2】:

    我会说使用 SimpleRepository: http://www.subsonicproject.com/docs/Using_SimpleRepository

    我即将使用自动迁移为多对多关联更新它,这将生成您需要的表/约束。我现在正在完成它,所以我需要几个星期。

    如果您愿意(无需迁移),您可以通过电子邮件向我发送代码,即 myname @ gmail。

    【讨论】:

    • 嗨,罗伯。我对您将如何处理 SimpleRepository 中的关系非常感兴趣!我是否能够拥有一个具有另一个类列表作为属性的类,该属性通过创建桥表并与每个对象定义相关联来处理?它会处理 Update(of ParentObject)(parentObject1) 并调用 delete 和 update db 命令来管理这个列表吗?