我有一个表Classes,它存储不同大学课程的数据(一个独特的Class_ID和Department,Course等)。
某些类交叉列出了多个名称。例如,同一类可以交叉列为HIST-204(历史)和AAST-103(非裔美国人研究)。一个班级可以有两个以上的交叉列表。
我想正确存储交叉列表,以便当学生使用任何可能的交叉列表搜索课程的教科书(存储在Class_Books表格中)时,会显示所需的书籍。学生在进行搜索时是否知道其他交叉列表,只有他们能够获得该课程的书籍才是不重要。
我正在考虑通过在Classes中存储Cross_List_ID来实现这一点,这表明给定的类只是现有类的交叉列表,其Class_ID将存储在该字段中。然后我只需要为交叉列出的Class_ID存储所需的书(在Class_Books中)。然后,当学生在搜索中输入课程时,我会确保包含Cross_List_ID所需的所有书籍。如果您同意这是可行的方法,我会对您如何设置该查询感兴趣(获取输入的class_id及其交叉列表的课本)。
另一个选项似乎是为每个交叉列表存储Class_Books数据..我不想这样做,因为我上传到数据库的原始Class和Class-Book数据不适合这个,因为每个文件都有单独的文件,并且只有一个交叉列表链接到Class-Book文件中的Book。此外,即使这种方法很容易实现,也会占用更多的数据库空间。
如果您不同意我的Cross_Listing_ID方法,我会对其他选项持开放态度。就像我说的,如果你同意这种方法,那么请帮我查询一下!
注意:Class-Books的结构只是Class_ID,Book_ID
答案 0 :(得分:0)
如果你必须在两者之间选择,请选择第一个选项。您不希望在课本中表面上重复条目。这可能会给你带来各种各样的问题。
更新由于您希望Class ID位于我已更新的where子句中。
至于查询这是我搜索图书的方式
SELECT DISTINCT books.*
FROM
classes main
LEFT JOIN classes crosslinked
ON main.Class_id = crosslinked.cross_link_class_id
LEFT JOIN class_books books
ON main.class_id = books.class_id
WHERE
main.class_id= 252
OR
crossLinked.class_id= 252
但你应该接受ijw的观点。只有一个与该类关联的class_names表会好得多。它会更清洁一点。然后你不必像以下那样做逻辑:如果cross_link_class_id不为null然后不允许学生注册它,教授不能教一个对于cross_link_class_id有一个null的类,毕竟你不会想要意外地超额预订课程或将教授记录为教学的课程数量增加一倍
以下是使用单独的类名表进行的操作。
SELECT DISTINCT books.*
FROM
classes
--LEFT JOIN class_names names
--ON main.Class_id = names.Class_id
LEFT JOIN class_books books
ON main.class_id = books.class_id
WHERE
clases.class_id = 252
请注意,OR语句已经消失,并且没有任何有趣的自联接(这可能会让人感到困惑),并且空的cross_link_class_id上面提到的逻辑已经消失。
注意:我对查询采取了一些自由,例如文字字符串将替换为参数。您不会选择*但使用实际的字段名称。