Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does a Data Mapper typically look like?

I have a table called Cat, and an PHP class called Cat. Now I want to make a CatDataMapper class, so that Cat extends CatDataMapper.

I want that Data Mapper class to provide basic functionality for doing ORM, and for creating, editing and deleting Cat.

For that purpose, maybe someone who knows this pattern very well could give me some helpful advice? I feel it would be a little bit too simple to just provide some functions like update(), delete(), save().

I realize a Data Mapper has this problem: First you create the instance of Cat, then initialize all the variables like name, furColor, eyeColor, purrSound, meowSound, attendants, etc.. and after everything is set up, you call the save() function which is inherited from CatDataMapper. This was simple ;) But now, the real problem: You query the database for cats and get back a plain boring result set with lots of cats data.

PDO features some ORM capability to create Cat instances. Lets say I use that, or lets even say I have a mapDataset() function that takes an associative array. However, as soon as I got my Cat object from a data set, I have redundant data. At the same time, twenty users could pick up the same cat data from the database and edit the cat object, i.e. rename the cat, and save() it, while another user still things about setting another furColor. When all of them save their edits, everything is messed up.

Err... ok, to keep this question really short: What's good practice here?

like image 794
openfrog Avatar asked Dec 28 '09 17:12

openfrog


People also ask

What is an example of data mapping?

For example, the state field in a source system may show Illinois as "Illinois," but the destination may store it as "IL." Data mapping bridges the differences between two systems, or data models, so that when data is moved from a source, it is accurate and usable at the destination.

What is Data Mapper design pattern?

The Data Mapper Pattern is an architectural pattern introduced by Martin Fowler in his book Patterns of Enterprise Application Architecture. A Data Mapper is a type of Data Access Layer that performs bi-directional transfer of data between objects in memory and persistent storage.

What does data mapping look like in prep?

Like automated data mapping tools, Prep involves drag-and-drop features in a visual interface but also supports Python and R integrations for advanced techniques and custom code. You may have trouble visualizing what the process of data mapping looks like, but following this simple outline will reveal how values and attributes are matched.

What should you look for in a data mapping tool?

To round out automation capabilities, look for a tool that can create a complete mapping workflow with the ability to schedule mapping jobs triggered by the calendar or an event. Data mapping is an essential part of ensuring that in the process of moving data from a source to a destination, data accuracy is maintained.

What do data mappers need to know about data management?

Data mappers will need to document and match those components in the data maps. Considering that your company’s stored data will only get larger, you need data management policies that track and facilitate the life cycle—or data lineage—of ingestion, mapping, storing, and analysis.

What is data mapping?

What is Data Mapping? Examples and Definition | Informatica What is Data Mapping? Data mapping is the process of connecting a data field from one source to a data field in another source. This reduces the potential for errors, helps standardize your data, and makes it easier to understand your data by correlating it, for example, with identities.


2 Answers

From DataMapper in PoEA

The Data Mapper is a layer of software that separates the in-memory objects from the database. Its responsibility is to transfer data between the two and also to isolate them from each other. With Data Mapper the in-memory objects needn't know even that there's a database present; they need no SQL interface code, and certainly no knowledge of the database schema. (The database schema is always ignorant of the objects that use it.) Since it's a form of Mapper (473), Data Mapper itself is even unknown to the domain layer.

Thus, a Cat should not extend CatDataMapper because that would create an is-a relationship and tie the Cat to the Persistence layer. If you want to be able to handle persistence from your Cats in this way, look into ActiveRecord or any of the other Data Source Architectural Patterns.

You usually use a DataMapper when using a Domain Model. A simple DataMapper would just map a database table to an equivalent in-memory class on a field-to-field basis. However, when the need for a DataMapper arises, you usually won't have such simple relationships. Tables will not map 1:1 to your objects. Instead multiple tables could form into one Object Aggregate and viceversa. Consequently, implementing just CRUD methods, can easily become quite a challenge.

Apart from that, it is one of the more complicated patterns (covers 15 pages in PoEA), often used in combination with the Repository pattern among others. Look into the related questions column on the right side of this page for similar questions.

As for your question about multiple users editing the same Cat, that's a common problem called Concurrency. One solution to that would be locking the row, while someone edits it. But like everything, this can lead to other issues.

like image 145
Gordon Avatar answered Oct 05 '22 23:10

Gordon


If you rely on ORM's like Doctrine or Propel, the basic principle is to create a static class that would get the actual data from the database, (for instance Propel would create CatPeer), and the results retrieved by the Peer class would then be "hydrated" into Cat objects.

The hydration process is the process of converting a "plain boring" MySQL result set into nice objects having getters and setters.

So for a retrieve you'd use something like CatPeer::doSelect(). Then for a new object you'd first instantiate it (or retrieve and instance from the DB): $cat = new Cat();

The insertion would be as simple as doing: $cat->save(); That'd be equivalent to an insert (or an update if the object already exists in the db... The ORM should know how to do the difference between new and existing objects by using, for instance, the presence ort absence of a primary key).

like image 34
Konel Sum Avatar answered Oct 06 '22 00:10

Konel Sum