所以这将是今年的虚拟问题,但我需要问,因为这不是我第一次通过这个问题。看看下表定义:
看看现在from_number是一个列,VARCHAR(45)但它会保存一个电话号码。因为我不知道一部手机在全世界可以有多少个号码,所以我试图覆盖几乎所有的号码。我想尽可能地保持数据库的完整性,所以我认为VARCHAR这不是保存此类信息的正确类型 - 也许我错了,你告诉我 - 所以我正在考虑更改INT或什至BIGINT.
当我在 Workbench 中定义一列时,我应该指定括号之间的数字,()而不是在所有情况下,但在我之前提到的那些情况下我必须这样做。所以如果我这样做:BIGINT()我收到了这个错误:
这指导我在此处阅读有关此 MySQL 类型的一些信息。基本上信息是这样的:
一个大整数。... 无符号范围是 0 到 18446744073709551615。
这让我问:在定义BIGINT()类型时应该为括号设置什么值。(我使用 BIGINT 是因为我不知道 INT 是否可以容纳电话所能容纳的数量 - 也许我也错了)。在 MariaDB/MySQL 数据库中创建|设计列的正确方法是什么?
无论如何,我想知道您的意见,经验,当然我想得到答案
注意:我使用 MySQL Workbench 最新版本来创建 ER 图。我也在使用 MariaDB 10.0.x
我正在与我工作的公司的开发人员进行永久讨论,因为他们说最好摆脱关系数据库中的关系强制(通过 FOREIGN KEY 约束定义)以加快大型查询并获得更好的结果表现。
考虑的平台是MySQL 5.x,没有设置FOREIGN KEY,甚至缺少相关表的一些PRIMARY KEY约束,至少对我来说是不合理的。也许他们是对的,我是错的,但我没有足够的论据来讨论这种情况。
三年来,这一直是首选方法。我是这家公司的新人(只有一个月),但是,随着产品“有效”,我对增强数据库犹豫不决;尽管如此,我注意到的第一件事是加载一个页面需要 1 分钟(是的,60 秒!)。
当前状况背后的说法之一是“非规范化”数据库比规范化数据库更快,但我不相信这是真的。
大多数相关查询都包括 JOIN 操作,这使得它们在处理大量数据(数据库包含数百万行)时运行非常非常缓慢。
通常,“CRUD”操作的处理是在应用程序代码级别实现的;例如,为了删除一些数据,让我们说TableA:
TableA和TableB,你能帮我详细阐述一个好的、准确的和可靠的答案来丰富辩论吗?
注意:以前可能有人问过(并回答过)类似的问题,但我无法通过 Google 找到任何内容。
mysql normalization database-design relational-theory denormalization
我mysql Ver 15.1 Distrib 5.5.46-MariaDB在 CentOS 6.7 服务器上运行。我正在尝试记录查询,我正在通过将日志重定向到文件来做,如下所示:
#/etc/my.cnf.d/server.cnf
# this is only for the mysqld standalone daemon
[mysqld]
#
# * Fine Tuning
#
key_buffer = 16M
max_allowed_packet = 512M
thread_stack = 192K
thread_cache_size = 8
log-output = FILE
#General Query Log
general_log
general_log_file = /var/log/mysql/mysql_query.log
#Error Log
log_error = /var/log/mysql/mysql_error.log
#Slow Query Log
log-slow-queries
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql_slow.log
long_query_time = 2
log-queries-not-using-indexes
collation-server = utf8_general_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
Run Code Online (Sandbox Code Playgroud)
在重新启动 MySQL 服务之前,我确实运行了以下命令来创建每个文件并分配适当的权限: …
我有这个简单的查询:
SELECT
friend_id
FROM
default_friend
WHERE
user_id = 1
Run Code Online (Sandbox Code Playgroud)
结果如下:
+-----------+
| friend_id |
+-----------+
| 2250 |
| 4901 |
| 7187 |
| 9337 |
| 9843 |
+-----------+
Run Code Online (Sandbox Code Playgroud)
现在我有这个查询也有点复杂:
SELECT
friend_id, user_id, approved
FROM
default_friend
WHERE
user_id = 1
AND (friend_id IN (SELECT
friend_id
FROM
default_friend
WHERE
user_id = 1))
AND approved = 0
Run Code Online (Sandbox Code Playgroud)
我的问题是:进入第二个查询的 SELECT 会返回与第一个查询返回的数据相同的数据吗?意思是friend_id = 2250, 4901, 7187, 9337, 9843 还是我需要运行第一个并以编程方式拆分结果并构建第二个?我也想知道哪种方式更合适!
我有下表fields:
+----------+---------+-----------------+-------------+---------+--------------+---------------+-----------+------------------------------+-------------+------------------+
| field_id | form_id | form_section_id | is_required | grid_id | is_base_grid | field_type_id | field_seq | field_name | field_class | field_class_data |
+----------+---------+-----------------+-------------+---------+--------------+---------------+-----------+------------------------------+-------------+------------------+
| 220481 | 9926 | NULL | 0 | NULL | NULL | 4 | 28 | Test | NULL | NULL |
| 281863 | 9926 | NULL | 0 | NULL | NULL | 10 | 29 | insert after yes no question | NULL | NULL |
| 220496 …Run Code Online (Sandbox Code Playgroud) 我有这个表结构:
id1 id2
1 2
1 3
1 4
2 1
2 5
Run Code Online (Sandbox Code Playgroud)
我需要构建一个查询来选择id2where id1is not in id2. 例如,如果id1 = 1只有id2=3和id2=4。
我试过这个:
SET @a=1;
SELECT DISTINCT x.id2
FROM tt x, tt y
WHERE x.id1=@a AND x.id1 != y.id2;
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
我有这个表结构和数据:
CREATE TABLE IF NOT EXISTS `default_relations_users` (
`id_user_rq` int(11) NOT NULL,
`id_user_ap` int(11) NOT NULL,
UNIQUE KEY `rusers_rq_ap_idx` (`id_user_rq`,`id_user_ap`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `default_relations_users` (`id_user_rq`, `id_user_ap`) VALUES
(1, 2),
(1, 3),
(1, 4),
(2, 1),
(2, 2),
(2, 3);
Run Code Online (Sandbox Code Playgroud)
我只需要获取值在左侧但不在右侧的行,例如:将不会选择 1,2 和 2,1 但 1,3 和 1,4 是。我试试这个查询:
SELECT * FROM default_relations_users
WHERE default_relations_users.id_user_rq = 1
AND NOT EXISTS (SELECT id_user_ap FROM default_relations_users WHERE id_user_ap = 1)
Run Code Online (Sandbox Code Playgroud)
也许我不明白子查询是什么意思,或者我以错误的方式使用。所以有什么帮助吗?
也许这是一个好或坏的问题,但在我的谷歌研究中,我无法找到一个好的答案(也许是因为我不擅长进行良好的搜索)。简而言之:
我正在尝试回答Stack Overflow 上的一个问题,并且用户已经分享了它的数据库配置,有些东西引起了我的注意:
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = '';
$db['default']['password'] = '';
$db['default']['database'] = 'gotche';
$db['default']['dbdriver'] = 'mysqli';
Run Code Online (Sandbox Code Playgroud)
数据库没有用户名!
不管使用的数据库 - 在场景中是 MySQL(不知道版本) - 这可能吗?
我不认为出于安全原因删除了用户名和密码:最好将其更改为类似的内容*****- 在这种情况下,每个人都会知道有用户名/密码,但我可以询问用户是否这是原因。
我脑子里有一个问题。最好创建一个表并在那里存储很多行,或者创建各种表并在其中存储几行?在物理级别上节省的性能和 I/O 是多少?多少空间将使用多张表而不是一张表?我正在考虑 Wordpress 如何处理多博客功能,因为我正在开始一个新项目并且正在寻找最佳方法。
我正在处理一个数据库图表,我有一个名为cm_identifier_type. 该表的每条记录都可以有或没有可下载的文件(保存了文件路径)。我已经确定了两种可能的方法来实现这一目标。
download_file为VARCHAR(250)并NULL默认设置为(这是因为并非所有记录都与下载相关)cm_identifier_type和 新表之间创建关系cm_download_file:现在,关于性能、磁盘空间节省、查询节省等,您会怎么做?您对这种边缘情况有什么建议?
注意:目前我使用的是 MariaDB 10.1.x 但这将在 MySQL 实例中,可能是 5.x 左右我完全不确定,因为我还没有得到这些细节
我有几天时间处理这个查询,但无法按我的意愿工作。这篇文章与此相关来自不同表的几个值,我在其中艰难找到了解决方案,但我完全错误并丢失了:(。所以基本上与另一篇文章的架构相同:5 个表:default_users、default_profiles、default_status、default_comment和 default_friend。这是每个的 SQL:
default_comment
CREATE TABLE `default_comment` (
`comment_id` int(11) NOT NULL AUTO_INCREMENT,
`friend_id` int(11) NOT NULL,
`message` text COLLATE utf8_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`status_id` int(11) NOT NULL,
`device` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`comment_id`)
) ENGINE=InnoDB AUTO_INCREMENT=13007 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Run Code Online (Sandbox Code Playgroud)
默认好友
CREATE TABLE `default_friend` (
`friend_id` int(8) NOT NULL,
`user_id` int(8) NOT NULL,
`is_suscriber` tinyint(1) NOT NULL DEFAULT '1',
`privacy` tinyint(1) NOT NULL DEFAULT '0',
`created_at` timestamp NOT …Run Code Online (Sandbox Code Playgroud) 看这张表:
CREATE TABLE IF NOT EXISTS `default_messages_users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`message_id` int(11) NOT NULL,
`owner_user_id` int(11) NOT NULL,
`to_user_id` mediumint(8) NOT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
Run Code Online (Sandbox Code Playgroud)
我只需要设置 message_id、owner_user_id、to_user_id 列的一种可能组合,这意味着组合(例如)1,1,1 只能存在一次,因此不允许重复。我怎么做?在它们之间创建索引?
提前干杯和感谢
我有这个表定义:
CREATE TABLE `media` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`brands_id` int(11) DEFAULT NULL,
`media_type` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`title` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`description` longtext COLLATE utf8_unicode_ci NOT NULL,
`thumbnail_url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`media_url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`media_code` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`inactive` tinyint(1) NOT NULL,
`createdAt` datetime NOT NULL,
`updatedAt` datetime NOT NULL,
`titleHtml` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`descriptionHtml` longtext COLLATE utf8_unicode_ci NOT NULL,
`useHtml` tinyint(1) NOT NULL,
PRIMARY KEY …Run Code Online (Sandbox Code Playgroud) mysql ×11
mariadb ×4
performance ×4
mysql-5.5 ×3
query ×3
update ×2
constraint ×1
datatypes ×1
insert ×1
join ×1
log ×1
logs ×1
null ×1
sql-server ×1
subquery ×1