【问题标题】:First Database Structure help Please第一个数据库结构帮助请
【发布时间】:2013-02-08 13:52:09
【问题描述】:

这是我第一次制作自己的mysql数据库,希望得到一些指点。我查看了以前的问题,发现可以一次搜索多个表......这样就扩大了我的可能性。

我想要做的是在 PHP 页面上有一个可搜索/可过滤的 Snowmobile 俱乐部列表。

这些俱乐部应该可以按州、县列出或按名称/其他包含的信息搜索。

我还希望它们在结果中按字母顺序排列,不管输入顺序如何。

目前我的想法是,为 NY、PA 等准备一张桌子

包含县(varchar)、俱乐部名称(varchar)、街道地址(长文本)、电话(varchar)电子邮件(varchar)网站地址(varchar)的列

我是否真的应该为每个县制作多个表格,例如 NY.ALBANY 、NY.MADISON

我选择的字段格式是否合理?

应将地址分解为子组件...例如 street1、street2、city、state、zip。

最后,我想我想要一个带有是或否的列“trailsopen”,并根据输入将 tr 背景更改为绿色或红色。

希望这是有道理的......

【问题讨论】:

  • 您可能应该只有一个表并且将状态也作为一列。从长远来看,拥有多个表只会让您自己更加困难。
  • 只要确保你很好地使用了你的索引,你不会有任何问题将它们全部放在一张表中。
  • @Pitchinnate 这是一个糟糕的建议!这就像说您不应该在面向对象语言中使用多个类来使其更容易。你应该总是在逻辑上把事情分开。
  • 介意扩展使用索引吗?
  • so magnus,您是否建议保留为 NY 、 PA 表,或进一步将表分解为 state.county

标签: php mysql database-design


【解决方案1】:

这是我将如何设置您的数据库:

state
id (tinyint) //primary key auto incremented unsigned
short (varchar(2)) // stores NY, PA
long (varchar(20)) // Stores New York, Pennsylvania

county
id (int) //primary key auto incremented unsigned
state_id (tinyint) //points to state.id
name (varchar(50))

club_county
id (int) //primary key auto incremented unsigned
county_id (int) //points to county.id
club_id (int) //points to club.id

club
id (int) //primary key auto incremented unsigned
name (varchar(100))
address (varchar(100)
city (varchar(25))
zip (int)
etc...

【讨论】:

  • county_id可以处理多个id吗?
  • 不需要将其分离到另一个表中,我将修改我的答案。
  • 现在你可以在每个俱乐部拥有多个 club_county 条目。
  • 明白了...感谢您的帮助。有没有办法通过表单轻松添加这些数据,而不是通过 phpMYadmin。看起来我会像疯了一样在桌子上跳来跳去。这是 mysql workbench 的其他建议的来源吗?
  • 这也是我推荐的。 +1 因为它更简洁:)。
【解决方案2】:

在我看来,一张桌子似乎足以满足您的需求。 MySQL 是如此强大,以至于有很多方法可以做任何事情。我建议下载和使用 MySQL Workbench,它使创建表、更改表和编写查询比将它们嵌入到网页中更容易和更快。

下载 MySQL Workbench -> http://dev.mysql.com/downloads/workbench/

您还需要了解很多有关 MySQL 查询的知识。我认为您可以将所需的所有信息放在一张表中,诀窍在于您使用哪个查询来显示信息。

例如,假设您只有 1 个表,所有状态都放在一起。您可以使用如下查询仅显示纽约州的雪地摩托俱乐部:

select * from my_table where state = "NY";

如果您想按俱乐部名称的字母顺序显示结果,那么您可以使用如下内容:

select * from my_table where state = "NY" order by clubname;

网上有很多文档。所以我建议做几个小时的研究并使用 MySQL Workbench。

Stack Overflow 的目的是回答与特定代码或查询有关的更具体的问题。因此,一旦您构建了一个程序,并在某些事情上遇到困难,您可以在这里提出具体问题。祝你好运!

【讨论】:

    【解决方案3】:

    你可以创建一个具有复合键约束的单个表。喜欢.. 我在一家公司有 3 个部门,每个部门都有多个子部门。所以我可以创建这样的数据库.. 部门编号 || sub_dept_id ||姓名 ||萨尔 ||地址 ||电话 ..其中 Dept_id 和 sub_dept_id 将共同代表主键并观察其唯一性。

    但是请记住,如果您的数据库太大,那么在您执行此步骤之前请考虑一下,您可能需要针对该场景进行集群或索引。 在编写 SQL 查询时,最好将一个主模块划分为多个子模块。所以你可以打破地址。 根据您的是/否....使用整数字段并计划它,如果它是,它将存储 1 否则 0(零)...

    【讨论】:

    • 我可以说仅纽约就有 243 个俱乐部......其中一些在多个县......所以增加了另一层,我的想法只是复制信息,但我肯定有更聪明的方法....
    【解决方案4】:

    您不应该为各个县制作单独的表格。您应该做的是创建一个州表、一个县表和一个地址表。

    结果可能如下所示:

    状态(id、代码、名称), 县 (id, stateID, name), 俱乐部(id、countyID、姓名、街道地址等)

    用于确定要拆分什么以及何时拆分的过程称为“数据库规范化”- 实际上有算法可以为您执行此操作。维基页面是一个很好的起点:http://en.wikipedia.org/wiki/Database_normalization

    街道地址的长文本很好,顺便说一句,其他字段的 varchars 也是如此。

    【讨论】:

    • 看起来你和@pitchennate 的想法是一致的......,俱乐部可以有多个县 ID 吗? membership.nyssnowassoc.org/club/show/415
    • @JohnMacKenzie 是的,我只是在原始评论中读错了他。今天不是我的一天:)。如果您的俱乐部可以跨越多个县,则数据库式方法是将club 表修改为:club (id, name, streetAddress, etc...) 并创建另一个表clubXcounty 或类似的表:clubXcounty (clubID, countyID)。然后,您可以在查询中使用 SQL JOIN 来获取所有涉及的县。您也可以将多个countyID 添加到club 表中,但这样您的SELECT 最终可能会更难编写和维护。
    • 感谢您的帮助和输入 magnus,非常感谢 :)
    • 谢谢,它变成了比我预期的要多得多的野兽,但是由于您的输入,它会变得更加有用/实用/有弹性:)
    【解决方案5】:
    1. 我真的应该为每个县制作多个表格吗,例如 NY.ALBANY 、NY.MADISON

    视情况而定,但在您描述的情况下,另一种选择可能是拥有一个包含所有雪地摩托俱乐部的数据库表,以及一个包含所有州/县的表。在 clubs 表中,您可以有一个 id 字段作为外键,它将条目链接到特定的州/县条目。 要将所有信息放在一起,您只需对表执行 JOIN 操作(请参阅 mysql 文档)。

    1. 我选择的字段格式是否合理?

    他们会工作..

    1. 应将地址分解为子组件...例如 street1、street2、city、state、zip?

    本质上,这里的问题是您现在或将来是否需要将其分解为子组件?如果它被分解,您将数据分开,这使得进一步的处理(例如生成串行字母,自动查找......)可能更简单,但这取决于您的处理;如果你不需要它分开为什么要让生活更复杂?

    已经有这么多答案了..同意了。

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 2010-11-29
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      相关资源
      最近更新 更多