设计包含数据库的数据库(数据库模型)

时间:2010-11-01 18:41:54

标签: sql database-design

我正在开发一个在线数据库建模器,用户可以在其中:

  • 创建新的数据库模式
  • save schemas
  • share schemas
  • 有架构的修订
  • fork schemas
  • 评论架构

功能包括:

  • JS draggable UI
  • “live”ajax editing

我想最初支持MSSql,MySQL,Postgres和SQLite。我想在Postgres中创建这个数据库。我有很少的Postgres经验,我主要处理的是MySQL。

这是我到目前为止所得到的:

发动机

id           int( pk )
name         varchar(40)

引擎的示例数据:

(
    {"id":1,"name":"postgres"}, 
    {"id":2, "name":"mysql"}
)


数据库

id           int ( pk )
name         varchar(100)
slug         varchar(40)
user_id      int
description  text
engine       int ( fk to engines.id )
fork_id      int ( keep track of forks )
parent_id    int ( this is for revisions )
comment_id   int ( fk to comments.id )
created      timestamptz(6)
modified     timestamptz(6)

数据库的样本数据:

(
    {
      "id":1,"name":"my first db",
      "slug":"my-first-db", 
      "user_id":3, 
      "description":"This is my first database.", 
      "engine":1,
      "created":"2009-09-01 22:22:10",
      "modified":"2009-09-01 22:22:10",
      "comments":3
     }
)


id           int ( pk )
database_id  int ( fk to databases.id )
name         varchar(40)
x_position   int // this is the X position from the top left of the container
y_position   int // this is the Y position from the top left of the container

表的样本数据:

(
    {"id":1,"name":"customers", "database_id":1, "x_position":1, "y_position":2 }
)


字段

id             int ( pk )
table_id       int ( fk to tables.id )
name           varchar(40)
type           int ( fk to types.id )
default        varchar ( 100 )
size           int
autoincrement  tinyint(1)
null           tinyint(1)

字段的示例数据:

(
    {"id":1,"name":"id", "type":2, "table_id":1, "autoincrement":1, "null":1 }
)


外键

id                 int ( pk )
origin_field_id    int ( fk to fields.id )
remote_field_id    int ( fk to fields.id )

外键的示例数据:

(
    {"id":1,"origin_field_id":2, "remote_field_id":3 }
)


类型

id                 int ( pk )
name               varchar(40)

外键的示例数据:

(
    {"id":1,"name":"BLOB" }
)


* types_engines(映射表)*

id                 int ( pk )
type_id            int
engine_id          int

外键的示例数据:

(
    {"id":1,"name":"BLOB" }
)


由于我是一个相对新手的SQLer,如果有人能够指出我所提出的关键设计缺陷并指出我没有想过的事情并且没有预见到可能是关键的话,我将不胜感激。以下是我需要解决的问题。

  • 我的数据库表有fork_idparent_id。我想跟踪数据库是否与其他数据库分开,另外以保持对数据库的修订。为了做到这一点,我是否需要这两个?
  • 我对发动机,类型和类型发动机建模的方式是否足够?由于不同的数据库有不同的字段类型,我认为这是处理它的理想方式。
  • 我的总体设计“好”吗?或者您可以发现标准化改进吗?

我意识到有一些我不支持的高级功能,例如视图/触发器,但我认为这在其简单的性质中很有用。

2 个答案:

答案 0 :(得分:2)

如果您希望开发人员(创建数据库的人)能够使用SQL的所有功能和设施,那将无法工作。你完全是错误的方式。你做了大量的工作,设计表等等,必须承认;但这一切都是不必要的,但这种投资可能会阻碍你放弃它。当然,如果你实施了这种结构,有人必须(a)管理它并(b)维护它。

只要你有一个ANSI SQL平台,开发人员的这些设施就已经完整地提供,并且已经完全提供给已发布的标准(而不是你或我认为这是一种很好的供应方式,控制方法,以及测试,共享对象)。请不要重新发明轮子。

  1. 为自由,轻松,不受限制的学习区域;这是您的大部分要求:

    • 在服务器中,授予开发人员Create_Database权限。
    • 他们可以根据自己的心愿管理自己的数据库,分享它们等 。
  2. 在测试任何共享对象将协同工作之前,需要稍微受限制(比免费和简单)环境。这是一个单独的共享数据库,您可以创建和管理该数据库(或者,只有一个,只有一个,开发人员获得DBA认证)。

    • 创建用户(每个开发人员一个)
    • 授予每个用户Create_Table(Rule,Proc等)权限

    • 他们可以根据自己的心愿管理自己的对象,分享它们等。

    • 每个对象所有者负责构建对象,共享对象,并在其所有者区域中对其进行测试。在开始正式对象开发之前,这仍然不是与正式测试相关的单一共享区域

    • 用于实际测试的单个共享区域是DBO

    • 作为DBA,您只需要管理DBO对象

    • 没有人是DBO
    • 当开发人员准备将其私有对象提升为正式共享对象时,他们会通知您
    • 您只需复制其私有对象的DDL,然后将其作为DBO
    • 执行
  3. 这就是全部。管理所需的所有表等已经实现。它是SQL目录。

    当然,有许多开发人员和DBA工具,只需点击几下即可完成上述任务。

答案 1 :(得分:0)

查找元数据管理工具和/或ERWin或其他数据库设计工具