在以下数据库中的第一个1:m和第二个1:m关系之间具有联结表有什么好处?
替代文字http://dl.getdropbox.com/u/175564/db/db- simple.png
Joe Celko的《 Smarties SQL中的树和层次结构 》一书说,原因是在1:m的 树 中具有独特的关系。例如,下表限制用户分别问两次完全相同的问题和两次给出完全相同的答案。
第一个1:m关系
users-questions =============== user_id REFERENCES users( user_id ) question_id REFERENCES questions ( question_id ) PK( user_id, question_id) // User is not allowed to ask same question twice
第二个1:m关系
questions-answers ================= question_id REFERENCES questions( question_id) answer_id REFERENCES answers( aswer_id ) PK( question_id, answer_id ) // Question is not allowed to have to same answers
这种关于唯一性的好处并不能说服我使我的代码更具挑战性。我不明白为什么我应该限制在数据库中有相同ID的问题或答案的可能性,因为我也许可以使用PHP禁止这样做。
它通常是由于数据重复造成的。
至于您的推理,是的,您可以在业务层中强制执行此操作,但是如果您犯了一个错误,则可能会破坏大量的代码。您遇到的问题是您的数据模型可能只有几个表。幸运的你。当您的数据模型增长时,如果您无法理解结构,并且必须将所有逻辑用于在GUI层中维护非规范化表,则很容易会遇到问题。请注意,在不使用锁定的情况下很难在SQL数据库的GUI上使线程安全,这会破坏性能。
DBMS非常擅长处理这些问题。您可以保持数据模型的清洁,并使用索引来提供所需的速度。您的目标应该是首先使它正确,并且仅在您明确需要这样做时才对表进行非规范化(以提高性能等)。
信不信由你,在许多情况下,拥有规范化的数据会让您的生活变得更轻松,而在应用程序方面就不会那么困难。例如,如果您有一个包含问题和答案的大表,则必须编写代码来检查它是否唯一。如果您有一个带有主键的表,则只需编写
insert into table (col1, col2) values (@id, @value) --NOTE: You would probably --make the id column an autonumber so you dont have to worry about this
如果您在数据库中有一个非唯一值,或者如果您毫无疑问地输入答案,数据库将阻止您插入。您需要做的只是检查插入是否起作用,仅此而已。您认为哪一个代码更少?