我有一个用户表,它使用单表继承,这样我可以在同一个表中同时拥有顾问,客户和内部用户。我想为“笔记”创建一个表格,以便内部用户可以为客户和顾问做笔记。我不确定是否应该创建consultants_notes和clients_notes表,还是只创建一个注释表?我应该考虑哪些因素?什么时候DB表应该分成两个单独的表?
回答
您的评论说:
我真的不知道还多少为每个用户类型的音符会有所不同,所以我希望能够保持它的弹性,如果可能的话
我认为这两种方式(一个或两个表)将足够灵活。但是,您还应该考虑normalization。如果你后来意识到顾问需要注释的日期,并且客户不需要这个字段,那么你会开始在你的表格上获得很多空值(空间,好像现在有点花费那么多:P和缺乏标准化)。
所以看起来一张桌子的解决方案是一个缺点。但是,一个表的解决方案将简化您的查询(可读性),也给你更好的性能(速度),因为你不会有使每个每个音符表的连接。
的优点和两个表溶液的缺点实际上是相反的一个表中的那些。那么,你的主要限制是什么?如果速度很快,你会选择一个表格解决方案。在我看来,我会选择两个表格解决方案,因为我无法忍受桌子上有不必要的价值。此外,有一个严格的设计,即不允许您将顾客票据价值添加到顾问票据价值的设计,比允许您使用简单更新来做到这一点要安全得多。尽管您可以为列值添加限制来解决此问题,但它并不相同。
嗯,这是我的愚见。希望它能帮助,或者至少让你三思而后行选择你的设计:)
PS前:要考虑的因素是大胆
我看到你的标签php
所以除非你使用两个不同的页面来读/写不同的用户类型的笔记我会去一个表,因为你不需要两个单独的查询。 除非您希望在表中有数千个注释,在这种情况下,单独的表可能更有效。
我会用一个表开始:
- 你已经只有一个表中的任何类型的用户。
- 制作三个相同的工件没有意义(并且使用三个表的代码的三倍)。 *更多的与各种音符的具体列的表:
但是,如果各种音符将从你可以考虑这是对你更好的人差别很大。 *一个通用表,有些额外的列并不总是被使用。
考虑:
- 多少音符将被存储在表中。
- 什么数据将被存储为每种类型的笔记。
检查如何构建索引以访问特定类型的笔记并决定哪些对您更好。
事情是,我不确定每种用户类型的笔记会有多少不同,所以我希望能够保持它的灵活性,如果可能的话。这是一个通用表的问题吗? – blacktie24 2012-02-07 22:50:24
我不这么认为。您以后可以随时拆分注释表 - 只需创建新表格,将注释移动到新表格并发布使用新数据结构的新版本产品。但现在 - 使用[KISS](http://en.wikipedia.org/wiki/KISS_principle)和[YAGNI(http://en.wikipedia.org/wiki/You_ain't_gonna_need_it)。 – 2012-02-08 08:47:59
对于三种类型的用户,你有一张表,那么为什么他们的笔记有三张表?
三张笔记表的问题在于,当您搜索特定用户的笔记时,您将不得不选择查看这些表中的一个。您最终将使用if-else语句在您的PHP代码中对此逻辑进行硬编码 - 或者 - 您将在查询中与三个表连接。
如果您决定拥有四种类型的用户,该怎么办?
- 1. 我应该在什么时候创建一个单独的表(mysql)?
- 2. 什么时候应该使用学说ORM和什么时候zend-db-table?
- 3. 该表应该分成两部分吗?
- 4. 什么时候应该放弃一个表变量的临时表?
- 5. 什么时候应该使用let {},什么时候只是简单的!= null
- 6. 什么时候应该使用Import-Package,什么时候应该使用Require-Bundle?
- 7. 什么时候应该扩展NSDocument,什么时候应该扩展NSWindowController?
- 8. 我们什么时候应该上课,什么时候不应该上课
- 9. 什么时候应该使用AWS,什么时候不使用
- 10. 什么时候应该创建一个新的分支?
- 11. 什么时候该类应该实现一个接口,什么时候不应该接口?
- 12. 什么时候应该使用ASP.NET MVC创建单独的控制器?
- 13. 什么时候应该使用一个引用,什么时候应该使用一个ProjectReference
- 14. 在C#中,什么时候应该使用一个结构,什么时候应该使用一个类?
- 15. 什么时候应该使用表格,divs或uls?
- 16. 什么时候应该在正则表达式中使用\ A?
- 17. 什么时候我不应该使用正则表达式?
- 18. 你怎么知道你什么时候需要单独的表格?
- 19. 什么时候应该使用getElementById?
- 20. 什么时候应该使用_aligned_malloc()?
- 21. 什么时候应该使用GC.SuppressFinalize()?
- 22. 什么时候应该使用`use`?
- 23. 什么时候应该抛出异常?
- 24. 什么时候应该调用SharedPreferencesBackupHelper()/ BackupAgent?
- 25. 什么时候应该用力推?
- 26. 什么时候应该调用setContentAspectRatio?
- 27. 什么时候应该使用didFinishLaunchingWithOptions?
- 28. 什么时候应该使用模板
- 29. 什么时候应该停止服务
- 30. GitHub:我应该什么时候做叉?
你说'内部用户可以在客户端和consultants'笔记,并这意味着一个笔记必须有一个InternalUserId和一个ClientUserId或ConsultantUserId?这意味着每个NOTE的两个字段 – 2012-02-08 00:01:28
注释将具有internal_user_id和subject_user_id(clientUserId或consultantUserId)。 – blacktie24 2012-02-08 00:07:39