如何轻松设计DB表/架构?

时间:2009-05-19 21:24:18

标签: database database-design schema

是否有一种简单的方法可以确定您设计的应用中每个表需要哪些字段和索引?

例如,如果它是一个webapp,它只是让人们创建列表(任意数量的列表,用户可以创建“要做的事情”列表或“购物”列表),并且用户可以指定其他用户编辑列表,以及列表是公开查看还是仅查看某些用户,如何设计表格以使其非常准确并快速设计?索引怎么样?

我在大学时就这样做过,然后在前一段时间重新回答了这个问题并提出了一个方法,但是想知道是否有标准和好的方法可以在现场进行。

7 个答案:

答案 0 :(得分:8)

数据库设计很难......

与生活中的许多事情一样,这是一系列的权衡。您需要决定的第一件事是您将使用的DBMS(MySQL,SQL Server,Oracle,PostgreSQL,“面向对象”数据库之一等。

然后你需要决定规范化和疯狂的JOIN数量来获取你的数据。需要解决诸如“我将在触发器,存储过程,应用程序代码中实现多少逻辑”等问题。

除了最简单的数据库之外,没有“Quick'n'Easy”设计方法。

'当然,这只是我的经历。 YMWV。

答案 1 :(得分:3)

完全解释数据库设计超出了这个答案的范围

我通常将我的设计分为三个部分(第1部分和第2部分在前面发生,而3部分通常在项目结束附近)
1)根据关系(父/子/等)创建表格 2)根据内容创建字段(父有x个属性等)
3)根据您从表中选择数据的方式最后创建索引

答案 2 :(得分:1)

没有听说过这个问题的任何正式方法,但有经验法则。所有名词和业务对象都成为表格,当然也是标准化的。而且我认为这些属性可以说明一切。我猜?

对于索引,它只是处理数据。任何加入的列都应该有一个索引(甚至可能是聚集的)。这非常......取决于。但有模式。但除了优化连接之外,许多索引与数据的使用方式直接相关,而这不是可以通过经验法则提供的。就像你通过pk和其他地方的last_name查找用户一样,last_name需要一个索引。

答案 3 :(得分:1)

我认为解决方案是主观的。当我必须设计表时,我会查看代表该特定数据模型的Java对象并从那里开始。你可以找到很多框架(Django,CakePHP,RoR)来开发模型,框架将构建相应的表。

因此,我建议您评估从中存储和开发表所需的功能和数据。另外,请查看您所拥有的工具集是否可以从对象结构中为您生成表格。

答案 4 :(得分:1)

我会选择直截了当(几乎)标准化的设计:

CREATE TABLE lists (
                    listid serial, 
                    name varchar, 
                    ownerid int references users(userid)
                   )

CREATE TABLE list_items (
                         listid int references lists(listid), 
                         value varchar, 
                         date datetime
                        ) 

CREATE TABLE permissions (
                          permissionid serial, 
                          description varchar,
                         )

CREATE TABLE list_permissions (
                               listid int references lists(listid),
                               permissionid int references permissions(permissionid)
                               userid int references users(userid)
                              )
CREATE TABLE users (
                     userid serial,
                     name varchar
                   )

要创建的索引取决于实际使用最多的查询以及它们的执行情况。例如,如果您在列表和list_items上查询很多(可能),您希望在listid和名称上有索引,如果您要按名称搜索。

只是一些想法。希望他们有所帮助。

答案 5 :(得分:1)

如果你还在试图看看它有什么用,我会尽量不锁定自己。

根据您的说明,您需要一个表格来显示用户的信息,以及:

tbl_lists:
    ID_list (primary key)
    UserID (foreign key to list owner)
    ListName

tbl_listItems:
    ID_listItem (primary key)
    ListID (foreign key to list)
    ItemDescription

tbl_permissions:
    ID_permission (primary key)
    ListID
    UserID (foreign key to user you're granting permission to)
    PermissionTypeID (what kind of permission)

tbl_permissionTypes:
    ID_permissionType (primary key)
    Description ("can view", "can edit", etc.)

在设计时,您可以更灵活地制作东西,效果更好。您可以稍后进行优化。

答案 6 :(得分:-1)

如果你想让事情变得非常简单并且不太关心规范化。您可以创建一个存储webapp所基于的主要对象的大表,例如:列表,并将其他较小的支持表链接到大表,例如:tbl_listType,tbl_permission,tbl_list_items)。

然后,当您编写查询时,您几乎肯定会包含主表,您可以链接到其他支持表中以获得更详细的信息。