我正在建立一个拥有'business_owners'和'customers'的数据库。我可以在几天内设置这个,但想看看你对最佳实践的看法。
我可以有两个表,'business_owners'和'customers',每个表都有姓名,电子邮件等等......或者......
我可以在一个表'用户'中创建一个user_type作为'business_owner'或'customer',只需使用该类型来确定要显示的内容。
我认为第二种选择是最好的,任何反馈?
答案 0 :(得分:2)
如果您有多个具有相同(或几乎相同)列的表,则应将它们压缩到一个表中。使用类型代码/ etc来区分必要,并为依赖于类型代码的列计算业务规则。
第二种选择是最好的方法。它是最具扩展性的,如果您需要使用包含业务所有者和业务所有者的结果集,它将是最容易使用的。客户。
答案 1 :(得分:0)
这取决于两种类型之间的差异,如果它们除了作为“用户”或“业务所有者”的角色之外共享完全相同的属性,我建议采用第二种方法来避免过度使用2个单独表格中的相同列。
答案 2 :(得分:0)
您如何在对象模型中对此进行建模?您是否会设置一个超级类,称之为“利益相关者”,它捕获业务所有者和客户的属性?那么您是否会设置专门的子类,“业务所有者”和“客户”来扩展利益相关者的定义?如果是这样,请继续阅读。
您的案例看起来像是Gen-Spec设计模式的一个实例。通过超类 - 子类层次结构,面向对象的程序员熟悉Gen-spec。不幸的是,对关系数据库设计的介绍倾向于跳过如何为Gen-Spec情况设计表。幸运的是,它很好理解。关于“关系数据库泛化专业化”的网络搜索将产生关于该主题的若干文章。你的一些热门歌曲将是之前的问题。这是一篇用Object Relational Mapping来讨论Gen-Spec的文章。
诀窍在于子类(专用)表的PK被分配的方式。它不是由某种自动编号功能生成的。相反,它是超类(通用)表中PK的副本,因此是对它的FK引用。
因此,如果案件是车辆,卡车和轿车,每辆卡车或轿车都会在车辆工作台上有一个入口,卡车也会在卡车桌上有一个入口,其PK值是相应PK的副本。车辆表。同样适用于轿车和轿车表。只需进行连接就可以很容易地判断出车辆是卡车还是轿车,而且您通常也想在这种查询中加入数据。