# [dm](https://dm.cynkra.com/) > Are you using multiple data frames or database tables in R? Organize > them with dm. > > - Use it for data analysis today. > - Build data models tomorrow. > - Deploy the data models to your organization’s Relational Database > Management System (RDBMS) the day after. ## Overview dm bridges the gap in the data pipeline between individual data frames and relational databases. It’s a grammar of joined tables that provides a consistent set of verbs for consuming, creating, and deploying relational data models. For individual researchers, it broadens the scope of datasets they can work with and how they work with them. For organizations, it enables teams to quickly and efficiently create and share large, complex datasets. dm objects encapsulate relational data models constructed from local data frames or lazy tables connected to an RDBMS. dm objects support the full suite of dplyr data manipulation verbs along with additional methods for constructing and verifying relational data models, including key selection, key creation, and rigorous constraint checking. Once a data model is complete, dm provides methods for deploying it to an RDBMS. This allows it to scale from datasets that fit in memory to databases with billions of rows. ## Features dm makes it easy to bring an existing relational data model into your R session. As the dm object behaves like a named list of tables it requires little change to incorporate it within existing workflows. The dm interface and behavior is modeled after dplyr, so you may already be familiar with many of its verbs. dm also offers: - visualization to help you understand relationships between entities represented by the tables - simpler joins that “know” how tables are related, including a “flatten” operation that automatically follows keys and performs column name disambiguation - consistency and constraint checks to help you understand (and fix) the limitations of your data That’s just the tip of the iceberg. See [Getting started](https://dm.cynkra.com/articles/dm.html) to hit the ground running and explore all the features. ## Installation The latest stable version of the {dm} package can be obtained from [CRAN](https://CRAN.R-project.org/package=dm) with the command ``` r install.packages("dm") ``` The latest development version of {dm} can be installed from R-universe: ``` r # Enable repository from cynkra options( repos = c( cynkra = "https://cynkra.r-universe.dev", CRAN = "https://cloud.r-project.org" ) ) # Download and install dm in R install.packages('dm') ``` or from GitHub: ``` r # install.packages("devtools") devtools::install_github("cynkra/dm") ``` ## Usage Create a dm object (see [Getting started](https://dm.cynkra.com/articles/dm.html) for details). ``` r library(dm) dm <- dm_nycflights13(table_description = TRUE) dm #> -- Metadata -------------------------------------------------------------------- #> Tables: `airlines`, `airports`, `flights`, `planes`, `weather` #> Columns: 53 #> Primary keys: 4 #> Foreign keys: 4 ``` dm is a named list of tables: ``` r names(dm) #> [1] "airlines" "airports" "flights" "planes" "weather" nrow(dm$airports) #> [1] 86 dm$flights %>% count(origin) #> # A tibble: 3 × 2 #> origin n #> #> 1 EWR 641 #> 2 JFK 602 #> 3 LGA 518 ``` Visualize relationships at any time: ``` r dm %>% dm_draw() ``` ![](reference/figures/README-draw.svg) Simple joins: ``` r dm %>% dm_flatten_to_tbl(flights) #> Renaming ambiguous columns: %>% #> dm_rename(flights, year.flights = year) %>% #> dm_rename(flights, month.flights = month) %>% #> dm_rename(flights, day.flights = day) %>% #> dm_rename(flights, hour.flights = hour) %>% #> dm_rename(airlines, name.airlines = name) %>% #> dm_rename(airports, name.airports = name) %>% #> dm_rename(planes, year.planes = year) %>% #> dm_rename(weather, year.weather = year) %>% #> dm_rename(weather, month.weather = month) %>% #> dm_rename(weather, day.weather = day) %>% #> dm_rename(weather, hour.weather = hour) #> # A tibble: 1,761 × 48 #> year.flights month.…¹ day.f…² dep_t…³ sched…⁴ dep_d…⁵ arr_t…⁶ sched…⁷ arr_d…⁸ #> #> 1 2013 1 10 3 2359 4 426 437 -11 #> 2 2013 1 10 16 2359 17 447 444 3 #> 3 2013 1 10 450 500 -10 634 648 -14 #> 4 2013 1 10 520 525 -5 813 820 -7 #> 5 2013 1 10 530 530 0 824 829 -5 #> 6 2013 1 10 531 540 -9 832 850 -18 #> 7 2013 1 10 535 540 -5 1015 1017 -2 #> 8 2013 1 10 546 600 -14 645 709 -24 #> 9 2013 1 10 549 600 -11 652 724 -32 #> 10 2013 1 10 550 600 -10 649 703 -14 #> # ℹ 1,751 more rows #> # ℹ abbreviated names: ¹​month.flights, ²​day.flights, ³​dep_time, #> # ⁴​sched_dep_time, ⁵​dep_delay, ⁶​arr_time, ⁷​sched_arr_time, ⁸​arr_delay #> # ℹ 39 more variables: carrier , flight , tailnum , #> # origin , dest , air_time , distance , #> # hour.flights , minute , time_hour , name.airlines , #> # name.airports , lat , lon , alt , tz , dst , #> # tzone , year.planes , type , manufacturer , #> # model , engines , seats , speed , engine , #> # year.weather , month.weather , day.weather , #> # hour.weather , temp , dewp , humid , wind_dir , #> # wind_speed , wind_gust , precip , pressure , … ``` Check consistency: ``` r dm %>% dm_examine_constraints() #> ! Unsatisfied constraints: #> • Table `flights`: foreign key `tailnum` into table `planes`: values of `flights$tailnum` not in `planes$tailnum`: N725MQ (6), N537MQ (5), N722MQ (5), N730MQ (5), N736MQ (5), … ``` Learn more in the [Getting started](https://dm.cynkra.com/articles/dm.html) article. ## Getting help If you encounter a clear bug, please file an issue with a minimal reproducible example on [GitHub](https://github.com/cynkra/dm/issues). For questions and other discussion, please use [community.rstudio.com](https://community.rstudio.com/). # Package index ## Basic Construct a `dm` object from data frames, see also [`vignette("howto-dm-df")`](https://dm.cynkra.com/articles/howto-dm-df.md). - [`dm()`](https://dm.cynkra.com/reference/dm.md) [`new_dm()`](https://dm.cynkra.com/reference/dm.md) [`is_dm()`](https://dm.cynkra.com/reference/dm.md) [`as_dm()`](https://dm.cynkra.com/reference/dm.md) : Data model class - [`dm_validate()`](https://dm.cynkra.com/reference/dm_validate.md) : Validator ## Database Construct a `dm` object from a database, see also [`vignette("howto-dm-db")`](https://dm.cynkra.com/articles/howto-dm-db.md). - [`dm_from_con()`](https://dm.cynkra.com/reference/dm_from_con.md) : Load a dm from a remote data source - [`dm_get_con()`](https://dm.cynkra.com/reference/dm_get_con.md) : Get connection ## Tables and columns Operate on the tables and columns stored in a `dm` object. - [`dm_select_tbl()`](https://dm.cynkra.com/reference/dm_select_tbl.md) [`dm_rename_tbl()`](https://dm.cynkra.com/reference/dm_select_tbl.md) : Select and rename tables - [`dm_get_tables()`](https://dm.cynkra.com/reference/dm_get_tables.md) : Get tables - [`pull_tbl()`](https://dm.cynkra.com/reference/pull_tbl.md) : Retrieve a table - [`dm_mutate_tbl()`](https://dm.cynkra.com/reference/dm_mutate_tbl.md) **\[experimental\]** : Update tables in a `dm` - [`dm_nrow()`](https://dm.cynkra.com/reference/dm_nrow.md) : Number of rows - [`dm_select()`](https://dm.cynkra.com/reference/dm_select.md) : Select columns - [`dm_rename()`](https://dm.cynkra.com/reference/dm_rename.md) : Rename columns ## Primary keys Primary keys uniquely identify rows in a table. A table can have at most one primary key. See also [`vignette("howto-dm-theory")`](https://dm.cynkra.com/articles/howto-dm-theory.md). - [`dm_add_pk()`](https://dm.cynkra.com/reference/dm_add_pk.md) : Add a primary key - [`dm_get_all_pks()`](https://dm.cynkra.com/reference/dm_get_all_pks.md) : Get all primary keys of a `dm` object - [`dm_has_pk()`](https://dm.cynkra.com/reference/dm_has_pk.md) : Check for primary key - [`dm_rm_pk()`](https://dm.cynkra.com/reference/dm_rm_pk.md) : Remove a primary key ## Unique keys Unique keys are similar to primary keys. Each table can have at most one record for each combination of values in a unique key. A table can have more than one unique key. - [`dm_add_uk()`](https://dm.cynkra.com/reference/dm_add_uk.md) : Add a unique key - [`dm_get_all_uks()`](https://dm.cynkra.com/reference/dm_get_all_uks.md) : Get all unique keys of a `dm` object - [`dm_rm_uk()`](https://dm.cynkra.com/reference/dm_rm_uk.md) : Remove a unique key ## Foreign keys Foreign keys establish links between tables by pointing to a primary or unique key in another table. See also [`vignette("howto-dm-theory")`](https://dm.cynkra.com/articles/howto-dm-theory.md). - [`dm_add_fk()`](https://dm.cynkra.com/reference/dm_add_fk.md) : Add foreign keys - [`dm_get_all_fks()`](https://dm.cynkra.com/reference/dm_get_all_fks.md) : Get foreign key constraints - [`dm_rm_fk()`](https://dm.cynkra.com/reference/dm_rm_fk.md) : Remove foreign keys ## Visualize Show a `dm` object, see also [`vignette("tech-dm-draw")`](https://dm.cynkra.com/articles/tech-dm-draw.md). - [`dm_gui()`](https://dm.cynkra.com/reference/dm_gui.md) **\[experimental\]** : Shiny app for defining dm objects - [`dm_draw()`](https://dm.cynkra.com/reference/dm_draw.md) : Draw a diagram of the data model - [`dm_set_colors()`](https://dm.cynkra.com/reference/dm_set_colors.md) [`dm_get_colors()`](https://dm.cynkra.com/reference/dm_set_colors.md) [`dm_get_available_colors()`](https://dm.cynkra.com/reference/dm_set_colors.md) : Color in database diagrams - [`dm_set_table_description()`](https://dm.cynkra.com/reference/dm_set_table_description.md) [`dm_get_table_description()`](https://dm.cynkra.com/reference/dm_set_table_description.md) [`dm_reset_table_description()`](https://dm.cynkra.com/reference/dm_set_table_description.md) : Add info about a dm's tables ## Deconstruct Rip a `dm` object apart and put it together, see also [`vignette("tech-dm-keyed")`](https://dm.cynkra.com/articles/tech-dm-keyed.md). - [`dm_deconstruct()`](https://dm.cynkra.com/reference/dm_deconstruct.md) **\[experimental\]** : Create code to deconstruct a dm object ## Flatten Combine multiple related tables, see also [`vignette("tech-dm-join")`](https://dm.cynkra.com/articles/tech-dm-join.md). - [`dm_flatten()`](https://dm.cynkra.com/reference/dm_flatten.md) **\[experimental\]** : Flatten a table in a `dm` by joining its parent tables - [`dm_flatten_to_tbl()`](https://dm.cynkra.com/reference/dm_flatten_to_tbl.md) : Flatten a part of a `dm` into a wide table - [`dm_disambiguate_cols()`](https://dm.cynkra.com/reference/dm_disambiguate_cols.md) : Resolve column name ambiguities ## Filter Filter across multiple tables, see also [`vignette("tech-dm-filter")`](https://dm.cynkra.com/articles/tech-dm-filter.md). - [`dm_filter()`](https://dm.cynkra.com/reference/dm_filter.md) : Filtering ## Zoom Focus on a single table, see also [`vignette("tech-dm-zoom")`](https://dm.cynkra.com/articles/tech-dm-zoom.md). - [`dm_zoom_to()`](https://dm.cynkra.com/reference/dm_zoom_to.md) [`dm_insert_zoomed()`](https://dm.cynkra.com/reference/dm_zoom_to.md) [`dm_update_zoomed()`](https://dm.cynkra.com/reference/dm_zoom_to.md) [`dm_discard_zoomed()`](https://dm.cynkra.com/reference/dm_zoom_to.md) : Mark table for manipulation - [`left_join(`*``*`)`](https://dm.cynkra.com/reference/dplyr_join.md) [`left_join(`*``*`)`](https://dm.cynkra.com/reference/dplyr_join.md) [`inner_join(`*``*`)`](https://dm.cynkra.com/reference/dplyr_join.md) [`inner_join(`*``*`)`](https://dm.cynkra.com/reference/dplyr_join.md) [`full_join(`*``*`)`](https://dm.cynkra.com/reference/dplyr_join.md) [`full_join(`*``*`)`](https://dm.cynkra.com/reference/dplyr_join.md) [`right_join(`*``*`)`](https://dm.cynkra.com/reference/dplyr_join.md) [`right_join(`*``*`)`](https://dm.cynkra.com/reference/dplyr_join.md) [`semi_join(`*``*`)`](https://dm.cynkra.com/reference/dplyr_join.md) [`semi_join(`*``*`)`](https://dm.cynkra.com/reference/dplyr_join.md) [`anti_join(`*``*`)`](https://dm.cynkra.com/reference/dplyr_join.md) [`anti_join(`*``*`)`](https://dm.cynkra.com/reference/dplyr_join.md) [`nest_join(`*``*`)`](https://dm.cynkra.com/reference/dplyr_join.md) [`cross_join(`*``*`)`](https://dm.cynkra.com/reference/dplyr_join.md) [`cross_join(`*``*`)`](https://dm.cynkra.com/reference/dplyr_join.md) : dplyr join methods for zoomed dm objects - [`filter(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`filter(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`filter_out(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`filter_out(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`mutate(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`mutate(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`transmute(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`transmute(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`select(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`select(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`relocate(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`relocate(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`rename(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`rename(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`distinct(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`distinct(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`arrange(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`arrange(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`slice(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`slice(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`group_by(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`group_by(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`ungroup(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`ungroup(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`summarise(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`summarise(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`reframe(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`reframe(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`count(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`count(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`tally(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`tally(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`pull(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) [`compute(`*``*`)`](https://dm.cynkra.com/reference/dplyr_table_manipulation.md) : dplyr table manipulation methods for zoomed dm objects - [`glimpse(`*``*`)`](https://dm.cynkra.com/reference/glimpse.dm.md) [`glimpse(`*``*`)`](https://dm.cynkra.com/reference/glimpse.dm.md) : Get a glimpse of your `dm` object - [`unite(`*``*`)`](https://dm.cynkra.com/reference/tidyr_table_manipulation.md) [`unite(`*``*`)`](https://dm.cynkra.com/reference/tidyr_table_manipulation.md) [`separate(`*``*`)`](https://dm.cynkra.com/reference/tidyr_table_manipulation.md) [`separate(`*``*`)`](https://dm.cynkra.com/reference/tidyr_table_manipulation.md) : tidyr table manipulation methods for zoomed dm objects - [`head(`*``*`)`](https://dm.cynkra.com/reference/utils_table_manipulation.md) [`tail(`*``*`)`](https://dm.cynkra.com/reference/utils_table_manipulation.md) : utils table manipulation methods for `dm_zoomed` objects ## Wrap Turn a `dm` object into a single table and back. - [`dm_wrap_tbl()`](https://dm.cynkra.com/reference/dm_wrap_tbl.md) **\[experimental\]** : Wrap dm into a single tibble dm - [`dm_unwrap_tbl()`](https://dm.cynkra.com/reference/dm_unwrap_tbl.md) **\[experimental\]** : Unwrap a single table dm - [`dm_nest_tbl()`](https://dm.cynkra.com/reference/dm_nest_tbl.md) **\[experimental\]** : Nest a table inside its dm - [`dm_pack_tbl()`](https://dm.cynkra.com/reference/dm_pack_tbl.md) **\[experimental\]** : dm_pack_tbl() - [`dm_unnest_tbl()`](https://dm.cynkra.com/reference/dm_unnest_tbl.md) **\[experimental\]** : Unnest columns from a wrapped table - [`dm_unpack_tbl()`](https://dm.cynkra.com/reference/dm_unpack_tbl.md) **\[experimental\]** : Unpack columns from a wrapped table ## Nested and packed data New verbs that power wrapping. - [`pack_join()`](https://dm.cynkra.com/reference/pack_join.md) **\[experimental\]** : Pack Join - [`json_nest()`](https://dm.cynkra.com/reference/json_nest.md) **\[experimental\]** : JSON nest - [`json_nest_join()`](https://dm.cynkra.com/reference/json_nest_join.md) **\[experimental\]** : JSON nest join - [`json_pack()`](https://dm.cynkra.com/reference/json_pack.md) **\[experimental\]** : JSON pack - [`json_pack_join()`](https://dm.cynkra.com/reference/json_pack_join.md) **\[experimental\]** : JSON pack join - [`json_unnest()`](https://dm.cynkra.com/reference/json_unnest.md) : Unnest a JSON column - [`json_unpack()`](https://dm.cynkra.com/reference/json_unpack.md) : Unpack a JSON column ## Materialize and upload Get data from and to the database, see also [`vignette("howto-dm-copy")`](https://dm.cynkra.com/articles/howto-dm-copy.md). - [`compute(`*``*`)`](https://dm.cynkra.com/reference/materialize.md) [`collect(`*``*`)`](https://dm.cynkra.com/reference/materialize.md) : Materialize - [`copy_dm_to()`](https://dm.cynkra.com/reference/copy_dm_to.md) : Copy data model to data source - [`dm_sql()`](https://dm.cynkra.com/reference/dm_sql.md) [`dm_ddl_pre()`](https://dm.cynkra.com/reference/dm_sql.md) [`dm_dml_load()`](https://dm.cynkra.com/reference/dm_sql.md) [`dm_ddl_post()`](https://dm.cynkra.com/reference/dm_sql.md) **\[experimental\]** : Create *DDL* and *DML* scripts for a `dm` a and database connection ## Modify Manipulate individual rows on the database, see also [`vignette("howto-dm-rows")`](https://dm.cynkra.com/articles/howto-dm-rows.md). - [`dm_rows_insert()`](https://dm.cynkra.com/reference/rows-dm.md) [`dm_rows_append()`](https://dm.cynkra.com/reference/rows-dm.md) [`dm_rows_update()`](https://dm.cynkra.com/reference/rows-dm.md) [`dm_rows_patch()`](https://dm.cynkra.com/reference/rows-dm.md) [`dm_rows_upsert()`](https://dm.cynkra.com/reference/rows-dm.md) [`dm_rows_delete()`](https://dm.cynkra.com/reference/rows-dm.md) **\[experimental\]** : Modifying rows for multiple tables ## Keys and cardinalities Check fulfillment and nature of relationships between tables. - [`dm_examine_constraints()`](https://dm.cynkra.com/reference/dm_examine_constraints.md) : Validate your data model - [`enum_pk_candidates()`](https://dm.cynkra.com/reference/dm_enum_pk_candidates.md) [`dm_enum_pk_candidates()`](https://dm.cynkra.com/reference/dm_enum_pk_candidates.md) **\[experimental\]** : Primary key candidate - [`dm_enum_fk_candidates()`](https://dm.cynkra.com/reference/dm_enum_fk_candidates.md) [`enum_fk_candidates()`](https://dm.cynkra.com/reference/dm_enum_fk_candidates.md) **\[experimental\]** : Foreign key candidates - [`dm_examine_cardinalities()`](https://dm.cynkra.com/reference/dm_examine_cardinalities.md) **\[experimental\]** : Learn about your data model - [`check_cardinality_0_n()`](https://dm.cynkra.com/reference/examine_cardinality.md) [`check_cardinality_1_n()`](https://dm.cynkra.com/reference/examine_cardinality.md) [`check_cardinality_1_1()`](https://dm.cynkra.com/reference/examine_cardinality.md) [`check_cardinality_0_1()`](https://dm.cynkra.com/reference/examine_cardinality.md) [`examine_cardinality()`](https://dm.cynkra.com/reference/examine_cardinality.md) : Check table relations - [`check_key()`](https://dm.cynkra.com/reference/check_key.md) : Check if column(s) can be used as keys - [`check_set_equality()`](https://dm.cynkra.com/reference/check_set_equality.md) : Check column values for set equality - [`check_subset()`](https://dm.cynkra.com/reference/check_subset.md) : Check column values for subset ## Table surgery Normalize and denormalize tables. - [`decompose_table()`](https://dm.cynkra.com/reference/decompose_table.md) **\[experimental\]** : Decompose a table into two linked tables - [`reunite_parent_child()`](https://dm.cynkra.com/reference/reunite_parent_child.md) [`reunite_parent_child_from_list()`](https://dm.cynkra.com/reference/reunite_parent_child.md) **\[experimental\]** : Merge two tables that are linked by a foreign key relation ## Database schemas New verbs that power access to database schemas. - [`db_schema_create()`](https://dm.cynkra.com/reference/db_schema_create.md) **\[experimental\]** : Create a schema on a database - [`db_schema_drop()`](https://dm.cynkra.com/reference/db_schema_drop.md) **\[experimental\]** : Remove a schema from a database - [`db_schema_exists()`](https://dm.cynkra.com/reference/db_schema_exists.md) **\[experimental\]** : Check for existence of a schema on a database - [`db_schema_list()`](https://dm.cynkra.com/reference/db_schema_list.md) **\[experimental\]** : List schemas on a database ## Example dm objects Ready to use and play with. - [`dm_nycflights13()`](https://dm.cynkra.com/reference/dm_nycflights13.md) : Creates a dm object for the nycflights13 data - [`dm_financial()`](https://dm.cynkra.com/reference/dm_financial.md) [`dm_financial_sqlite()`](https://dm.cynkra.com/reference/dm_financial.md) : Creates a dm object for the Financial data - [`dm_pixarfilms()`](https://dm.cynkra.com/reference/dm_pixarfilms.md) : Creates a dm object for the pixarfilms data ## Structure and contents Recreate a `dm` object. - [`dm_paste()`](https://dm.cynkra.com/reference/dm_paste.md) : Create R code for a dm object - [`dm_ptype()`](https://dm.cynkra.com/reference/dm_ptype.md) : Prototype for a dm object # Articles ### All vignettes - [Relational data with dm: Cheat sheet](https://dm.cynkra.com/articles/cheatsheet.md): - [Updating tables and dm objects](https://dm.cynkra.com/articles/wip/dm-insert.md): - [UNKNOWN TITLE](https://dm.cynkra.com/articles/wip/dm-readme-old.md): - [shiny with {dynafilter}](https://dm.cynkra.com/articles/wip/dm-shiny-dynafilter.md): - [Tips and tricks](https://dm.cynkra.com/articles/wip/dm-tips-and-tricks.md): - [Getting started with dm](https://dm.cynkra.com/articles/dm.md): - [Copy tables to and from a database](https://dm.cynkra.com/articles/howto-dm-copy.md): - [Create a dm object from a database](https://dm.cynkra.com/articles/howto-dm-db.md): - [Create a dm object from data frames](https://dm.cynkra.com/articles/howto-dm-df.md): - [Insert, update, or remove rows in a database](https://dm.cynkra.com/articles/howto-dm-rows.md): - [Introduction to relational data models](https://dm.cynkra.com/articles/howto-dm-theory.md): - [Migration guide: 'cdm' -\> 'dm'](https://dm.cynkra.com/articles/tech-dm-cdm.md): - [Class dm and basic operations](https://dm.cynkra.com/articles/tech-dm-class.md): - [Visualizing dm objects](https://dm.cynkra.com/articles/tech-dm-draw.md): - [Filtering in relational data models](https://dm.cynkra.com/articles/tech-dm-filter.md): - [Joining in relational data models](https://dm.cynkra.com/articles/tech-dm-join.md): - [Manipulating individual tables](https://dm.cynkra.com/articles/tech-dm-keyed.md): - [Model verification - keys, constraints and normalization](https://dm.cynkra.com/articles/tech-dm-low-level.md): - [Function naming logic](https://dm.cynkra.com/articles/tech-dm-naming.md): - [Zooming and manipulating tables](https://dm.cynkra.com/articles/tech-dm-zoom.md):