MySql数据库结构:基于单列和不同值的搜索[关闭]

Posted

技术标签:

【中文标题】MySql数据库结构:基于单列和不同值的搜索[关闭]【英文标题】:MySql database structure for : Search based on single column and different value [closed] 【发布时间】:2016-02-08 03:25:01 【问题描述】:

我需要创建一个数据库,但我没有得到正确的逻辑。

这就像一个故事,但我没有任何其他方式来解释它。

场景是: 共有三个实体; CityBooksLibrary

我必须执行一项任务,其中我将获得 CityIdBookIds 数组作为输入,并且我必须根据以下条件抛出 LibraryNames

    Library 应该在给定的City 中。 Library 应该拥有所有书籍。

我有两种输入类型 首先是City(它将为我提供一个CityNameCityId) 和 其次是Books(它将提供一个由多个BookIds或多个BookNames组成的数组)。

如果难以理解,请与我讨论,我将尝试清除概念。

这是我的一个严重问题。

【问题讨论】:

我不太明白这一点,请澄清:你有@​​987654336@ 和BookIds 的数组,你想找到LibraryId,还是相反? 实际上我无法决定如何设计数据库来执行此任务。如果我说我有 CityId 和 BookIds 数组,那么它表示我已经创建了带有字段(CityId 和 CityName)的 City Master 表和带有字段(BookId 和 BookName)的 Books Master 表。 我只有一个故事,我必须做什么......没有别的......我创造了一些逻辑,但经过长时间的思考,它在某些标准上失败了那个粗略的逻辑。请稍候 我认为您应该首先设计一个数据库,然后基于该数据库尝试解决您的任务 这是唯一的问题,数据库应该设计成什么样的概念 【参考方案1】:

试试这个:

create table City
    (
     Id int,
     Name varchar(50)
    );

    insert into City (Id, Name) 
    VALUES 
    (1, 'Toronto'), 
    (2, 'Chicago')

    create table Libraries(
    Id int,
    Name varchar(50),
    CityId int
    );

    insert into Libraries (Id, Name, CityId) 
    VALUES 
    (1, 'Toronto Library 1', 1),
    (2, 'Toronto Library 2', 1),
    (3, 'Chicago Library 1', 2),
    (4, 'Chicago Library 2', 2)

    create table Books(
    Id int,
    Isbn varchar(12),
    LibraryId int
    );

    insert into Books (Id, Isbn, LibraryId) 
    Values
    (1, '1234567891', 1),
    (2, '13344555', 1),
    (3, 'x123sada', 1),
    (4, 'xasdsadas', 2),
    (5, 'axxzksda', 2)

    select DISTINCT b.Name 
    from Books a
    inner join Libraries b
    on a.LibraryId = b.Id
    where Isbn in ('1234567891', '13344555')
    and b.CityId = 1

编辑: 或 4NF:

create table City
(
 Id int,
 Name varchar(50)
);

insert into City (Id, Name) 
VALUES 
(1, 'Toronto'), 
(2, 'Chicago')

create table Libraries(
Id int,
Name varchar(50),
CityId int
);

insert into Libraries (Id, Name, CityId) 
VALUES 
(1, 'Toronto Library 1', 1),
(2, 'Toronto Library 2', 1),
(3, 'Chicago Library 1', 2),
(4, 'Chicago Library 2', 2)

create table Books(
Id int,
Isbn varchar(12),
);

insert into Books (Id, Isbn) 
Values
(1, '1234567891'),
(2, '13344555'),
(3, 'x123sada'),
(4, 'xasdsadas'),
(5, 'axxzksda')

create table LibraryBooks
(
LibraryId int,
BookId int
);

insert into LibraryBooks (LibraryId, BookId)
VALUES
(1, 1),
(1, 2),
(3, 1),
(2, 4),
(5, 2)

select DISTINCT c.Name
from Books a
inner join LibraryBooks b
on a.Id = b.BookId
inner join Libraries c on
c.Id = b.LibraryId
where Isbn in ('1234567891', '13344555')
and c.CityId = 1

【讨论】:

感谢您的回答,我仍然不知道它是否会起作用,但似乎它可能是我的问题的解决方案,打算尝试并回复 @AlokKumarNikhil 这个解决方案可能会起作用,但表格书和图书馆之间的关系应该是多对多的。在这种情况下,如果多个图书馆中有一本书,那么同一本书的每个图书馆的书表中都会有多个条目...例如,如果 isbn 444445 的书在 3 个图书馆中,那么您将拥有三个条目,例如id, 5, isbn 444445 libraryId 1, next row id 6, isbn 444445, LibraryId 2, next row id 7, isbn 444445, LibraryId 4 等等...这不完全符合规范化规则... @Aleksandar Miladinovic 是的,你是对的,但没有正确或错误的答案,因为这真的取决于你在做什么。如果您正在构建一个内容管理系统,您将在其中提供创建、删除和修改书籍的能力,那么是的,4NF 是最好的解决方案。如果您正在处理大量数据并希望获得快速性能,那么这是更好的方法,因为它不需要内部连接另一个表。如果您从 csv 或外部源批量插入,那么这将是更好的方法。这真的取决于.. 我同意,但我认为这是他们需要设计一个数据库并放松所有规范化规则的作业......所以这可能是他们将开发的第一个数据库,它是很高兴熟悉所有概念以及所有关系如何运作等...... 是的,那么你是对的 100%。见编辑【参考方案2】:

你可以这样组织它:(三个表)

City:
Id, Name

Id = 唯一编号

Library:
Id, Name, LiesInCity

Id = 唯一编号LiesInCity = 图书馆所在城市Id

Book:
Id, Name, LiesInLibrary

Id = 号码LiesInLibrary = 图书馆Id 这本书在。

然后你会SELECT你拥有的书单,并检查它们是否都在那个Library中。 (您还要检查Library 是否在右边City

注意:如果一本书在多个Library's 中,您需要有多个Book 条目

【讨论】:

图书馆有一点问题 - 书籍关系应该是多对多的(同名书籍可以在多个图书馆,多个图书馆可以有同名书籍)所以你可以解决这个问题第四张表...实际上是比拥有多个书籍条目更好的解决方案... @ Aleksandar Miladinovic 是的,你是对的,如果是的话,你有什么逻辑来创建这样的数据库,那么请与我分享。 @AlokKumarNikhil 我希望你能完成整个工作,我只会提出建议 :) 但如果你愿意,我会写答案......我认为第一种方法更适合学习和对问题的理解:)

以上是关于MySql数据库结构:基于单列和不同值的搜索[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库的索引类型

在大型mysql表中找到每个不同的其他值出现次数最多的值的有效方法[关闭]

Map集合概述和特点

mysql单列索引多列索引的使用

浅析索引

简单的数据库查看器和搜索工具 [关闭]