0

让我试着解释一下我正在处理的应用程序的情况,

我有接近 7 个类别,比如说 A、B、C、D、E、F 和 G。这些类别在 DB 端没有任何表。现在用户从这 7 个类别中选择一些类别,比如说 C,所以在类别中C,我还有另一组子类别,即 C1、C2、C3 到 C30。现在假设用户选择 C2,对于 C2 子类别,我在数据库中有一个表,一旦用户通过前端输入所有数据,就会插入该表。现在 C2表有 8 列,即 c2t1id,c2t2....c2t8。它还具有自动增量 id 列,该列为该表的每个插入获取自动增量以及该表的主键。

现在我的问题是,我需要向用户显示他们在所有表中的应用程序中的所有插入。用户可以在所有 7 个类别中插入,每个类别都有子类别 upt0 30,根据现有设计,这接近 210 个表.

现在我的登录表由 id/name/pw 构成。

现在从 db 的角度来看我的设计,我开始觉得这个设计有些缺陷,我开始觉得只是要检索用户的 5 条记录,我需要搜索 200 多个表与长的多选择加入?

我需要一些提示,以说明我应该如何进一步处理。如果需要,我准备重新设计。

4

4 回答 4

1

听起来您肯定需要在继续进行之前检查您的设计。

与其泛泛而谈,不如说具体。当人们不知道数据的细节时,很难推荐数据库设计。

所以,具体告诉我们数据是什么。

编辑:

鉴于您告诉我们您的数据,它看起来像这样:

USER
----------------------
ID (PK) INTEGER AUTOINCREMENT NOT NULL
EMAIL (PK) VARCHAR(1000) NOT NULL
FIRST_NAME VARCHAR(50) NOT NULL
LAST_NAME  VARCHAR(50) NOT NULL
ENCRYPTED_PASSWORD ....etc


POST
--------------
ID (PK) INTEGER AUTOINCREMENT NOT NULL
USER (FK) INTEGER NOT NULL
CONTENT TEXT NOT NULL
DATE_POSTED TIMESTAMP NOT NULL
DATE_EDITED DATETIME NOT NULL


POST_CATEGORIES
--------------------
ID (PK) INTEGER AUTOINCREMENT NOT NULL
CATEGORY_ID (FK) INTEGER NOT NULL
POST_ID (FK) INTEGER NOT NULL

CATEGORY (hierarchal table)
------------------------------
ID (PK) INTEGER AUTOINCREMENT NOT NULL
PARENT_ID INTEGER
CATEGORY_NAME VARCHAR(200) NOT NULL

请注意,CATEGORY 表使用的是简单的代理列表模型。其他类型的模型是可能的。有关更多详细信息,请参阅优秀的在 MySQL 中管理分层数据一文。

使用这种设计,获取用户帖子列表将是:

select * from POSTS where USER = (select ID from USER where FIRST_NAME = 'John' and LAST_NAME = 'Doe');

如果您想添加类别,您也可以加入 POST_CATEGORIES 和 CATEGORY 表。显然这是一个简化的示例,但希望您能看到这种设计如何支持在少数表格中包含数十万或数百万个帖子的数百或数千个类别。

于 2012-06-10T16:56:37.247 回答
0

是的,那个设计是个失败者。210张桌子?再想想。停止考虑表格和列,并将其表达为您要解决的问题。也许关系数据库在这里不合适。

于 2012-06-10T16:41:45.500 回答
0

每个节点都有一个表的层次结构不是通常的答案 - 我建议查看这个问题的答案,看看是否有任何建议适用于您的问题。

于 2012-06-10T23:41:44.010 回答
0

根据您对@wadesworld 的评论/解释这是一个简单的设计,可能会为您指明正确的方向

我使结构尽可能简单,您可以使用更多列/详细信息来适应您的应用程序,并且我已经展示了一些如何查询数据的示例。

TABLE: USERS
ID | USERNAME | PASSWORD

TABLE: CATEGORIES
ID | CATEGORY_ID | NAME

TABLE: POSTS
ID | CATEGORY_ID | DESCRIPTION | USER_ID



// list all top level categories (We use NULL in categories.category_id to indicate it has no parents)
SELECT * FROM categories WHERE category_id IS NULL;

// list all sub categories for category_id = 2
SELECT * FROM categories WHERE category_id=2;

// list parent and child categories, for use in a html select
SELECT parent.id, parent.name, child.id, child.name
  FROM categories AS parent
  JOIN categories AS child ON child.category_id=parent.id
  WHERE parent.category_id IS NULL

// insert a post into category_id=2 for user_id = 1
INSERT INTO posts (category_id, description, user_id)
  VALUES ('2', 'test post', 1);

// select all posts by user with username=tom
SELECT * FROM users
 JOIN posts ON posts.user_id=users.id
 JOIN categories ON categories.id=posts.category_id
 WHERE users.username='tom';

 // count the number of posts made by tom in each category
 SELECT categories.name, COUNT(*)
   FROM users
   JOIN posts ON posts.user_id=users.id
   JOIN categories ON categories.id=posts.category_id
   WHERE users.username='tom';
   GROUP BY categories.name
于 2012-06-10T23:58:04.727 回答