- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在创建一个人们可以发布文章的页面。当用户发布文章时,它会显示在列表中,例如 Stack Overflow 上的相关问题(当您添加新问题时)。这相当简单。
我的问题是我有两种类型的用户。 1) 未注册的私有(private)用户。 2) 公司。
未注册用户需要输入姓名、邮箱和电话。而公司用户只需要输入他们的公司名称/密码。相当简单。
我需要减少过多的数据库使用,并尝试优化数据库并有效地构建表。
现在我手头的问题:
所以我有一张表,其中包含有关公司的信息、ID (guid)、姓名、电子邮件、电话
等。
我正在考虑创建一个名为 articles 的表,其中包含 ArticleID、标题、内容和发布日期。
一张表,包含未注册用户的信息、ID、姓名、电子邮件和电话。
如何将文章表绑定(bind)到公司/未注册用户表。制作一个包含 2 个值的整数是否很好,1 = 未注册用户和 2 = 公司,然后是一个带有指定用户/公司 ID 号的字段。看起来你需要很多额外的代码来查询数据库。表现?那么我怎么能把文章连同联系信息一起退回呢?您还应该能够退回特定公司的所有文章。
所以表公司将是:
ID (guid), company name, phone, email, password, street, zip, country, state, www, description, contact person and a few more that i don't have here right now.
表未注册用户:
ID (guid), name, phone, email
表格文章:
ID (int/guid/short guid), headline, content, published date, is_company, id_to_user
有没有更好的方法?
我正在寻找的品质是:性能、易于查询和易于维护(添加新字段、索引等)
最佳答案
您描述的问题在数据建模理论中称为表继承。在 Martin Fowler 的书中,解决方案是:
所以从理论和行业实践的角度来看,所有三种解决方案都是可以接受的:一张表 Posters 的列为 NULLable 列(即单表),三张表 Posters、Companies 和 Persons(即类继承)和两张表 Companies和 Persons(即具体继承)。
现在,利弊。
记录结构在Inside the Storage Engine: Anatomy of a record中讨论。 :
NULL bitmap
- two bytes for count of columns in the record
- variable number of bytes to store one bit per column in the record, regardless of whether the column is nullable or not (this is different and simpler than SQL Server 2000 which had one bit per nullable column only)
因此,如果您至少有一个 NULLable 列,您将支付每条记录中 NULL 位图的成本,至少 3 个字节。但如果您有 1 列或 8 列,成本相同!第 9 个 NULLable 列将向每个记录中的 NULL 位图添加一个字节。 Estimating the Size of a Clustered Index 中描述了该公式: 2 + ((Num_Cols + 7)/8)
在数据库系统中,实际上只有一个驱动性能的因素:扫描的数据量。一个查询计划扫描的记录有多大,它要扫描多少条记录。因此,要提高性能,您需要:
现在为了分析这些标准,您的帖子中缺少一些东西:流行的数据访问模式,即。数据库将被命中的最常见查询。这取决于您在网站上显示帖子的方式。考虑这些可能的方法:
posts front page:像 SO,最近的帖子页面,包含标题、摘录、发布时间和作者基本信息(姓名、头像)。要显示此页面,您需要加入 Posts with authors,但您只需要作者姓名和头像。单表继承和类表继承都可以,但具体表继承会失败。这是因为您无法承受这样的查询来进行条件联接(即联接发布给公司 或 人员的文章),这样的查询将不是最佳的。
<每个作者的帖子:用户必须先登录,然后他们才能看到自己的帖子(这对于非公开的面向帖子的网站很常见,例如事件跟踪)。对于这样的设计,所有三种表继承方案都适用。
有一些一般的性能注意事项(即缩小数据范围)需要考虑,但缺少关键信息:您将如何查询数据、您的访问模式。必须针对访问模式优化数据模型:
不用说了, don't use guids for ids 。除非您要构建分布式系统,否则由于宽度过大,它们是一个糟糕的选择。碎片也是一个潜在的问题,但可以通过使用顺序 guid 来缓解。
关于database - 如何在 SQL Server 2008 中优化存储以下 SQL 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2312978/
我是一名优秀的程序员,十分优秀!